- 浏览: 728559 次
- 性别:
- 来自: 北京
-
最新评论
-
wxweven:
Surmounting 写道既然 Java 的跳表那么少,我决 ...
SkipList 跳表 -
暮雪云然:
写的不错,很透彻
Java静态内部类 -
bzhao:
好,赞扬!
Linux信号详解 -
jacktao219:
赞一个~! ,现在正在看redis 所以接触到跳表
SkipList 跳表 -
is_leon:
vote--后还要判断是否为0吧,如果为0则废掉重新置位can ...
现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
文章列表
Erlang 学习笔记
- 博客分类:
- erlang
函数的返回值
函数不会显示地返回值,函数中最后一条语句的执行结果将作为函数的返回值。
main(_) ->
{A, B} = test(),
io:format("A = ~w, B = ~s~n", [A, B]).
test() ->
{2,"hello"}.
函数的分支
同一个函数中,并列的逻辑分支之间,用分号 “;” 分界;顺序语句之间,用逗号 “,” 分隔。
Atom 的用途
Atoms are literals, constants with their ...
web 聊天室支持多人在线聊天,某个人发了一条消息,在线的所有人都能实时看到。
tornado 自带的 demo 演示了如何实现一个 web 聊天室, 通过源码,我总结一下它设计方案。
服务器端
维护一个消息缓存,用来保存所有人发的消息。
维护一个等待队列,用来保存等待新消息的用户。
如下图所示:
(1) 添加消息
服务器把用户发送的消息加入消息缓存,同时唤醒等待队列中的用户,
告诉它们把最新的消息取走。
(2) 推送消息给用户
服务器与用户保持长连接,如果用户的 cursor 到达了消息缓存的末尾,说明
服务器暂时没有最新的消息,这时让用户一直等待,等待 ...
6个步骤
步骤1:创建子进程,杀死父进程,目的是为了步骤2中调用setsid可以成功。
步骤2:创建新会话,并自任组长。目的是脱离控制终端
会话组长调用 setsid 会失败,步骤1创建的子进程必然不是会话组长,
这就保证了 setsid 可以成功。
步骤3:修改工作目录为根目录。
当进程没有结束时,工作目录是不能卸载的,为了防止这种情况,
把工作目录设为根目录。因为根目录一般是不用卸载的。
步骤4:修改文件权限掩码,很多情况下,守护进程会创 ...
非阻塞connect的实现
- 博客分类:
- linux
步骤1: 设置非阻塞,启动连接
实现非阻塞 connect ,首先把 sockfd 设置成非阻塞的。这样调用
connect 可以立刻返回,根据返回值和 errno 处理三种情况:
(1) 如果返回 0,表示 connect 成功。
(2) 如果返回值小于 0, errno 为 EINPROGRESS, 表示连接
建立已经启动但是尚未完成。这是期望的结果,不是真正的错误。
(3) 如果返回值小于0,errno 不是 EINPROGRESS,则连接出错了。
步骤2:判断可读和可写
然后把 sockfd 加入 select 的读写监听集合,通过 select 判 ...
Memcached内存管理机制
- 博客分类:
- linux
Slab 分配机制
Memcached 不是把所有大小的数据都放在一起的,而是预先分配一系列的 slab,每个
slab 负责一定范围内的数据存储。
初始时,Memcached 为每一个 slab 分配 一个Page(1M) 的内存, slab内再把page切分
成一个一个 Chu ...
原文地址: http://www.cnblogs.com/leoo2sk/archive/2011/08/11/consistent-hashing-intro.html
Consistent hashing算法非常简洁,如果你有一系列服务器,需要把很多 keys (objects)映射到这些
服务器上。这时Constent hashing就派上用场了。典型的例子包括 ...
算法导论习题 5.1 -2
- 博客分类:
- algorithms
描述random(a, b)过程的一种实现,它只调用random(0,1)。作为a和b的函数,
你的程序期望运行时间是多少?
算法描述这个题目相当于在能随机生成0,1的前提下,要求生成[0, 1, ...,n-1]范围内的一个整数1 求出最小的 m,使2^m >= n-12 通过random(0,1),产生一个m比特的整数,这样能随机产生[0, 2^m-1]内的整数,
若产生的整数位于[0, n-1]内,则取这个数作为结果。如果这个数在[0,n-1]外,则丢弃它,再次运行算法重新生成一个。
算法的正确性 a) 证明上述算法可以产生 [0, n-1]范围内的随机数在范围[ ...
typedef union {
int n;
char p[sizeof(int)];
} union_t;
union_t ut;
memset(&ut,0, sizeof(ut));
ut.p[0] = 13;
printf("%d\n", ut.n);
输出结果是什么?
一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian
的。少部分,如MAC OS ,是Big Endian 的。
所谓MSB (Most Significant Byte)就是, ...
vim配置文件精简版
- 博客分类:
- linux
"Get out of VI's compatible mode..
set nocompatible
"Sets how many lines of history VIM har to remember
set history=400
"Enable filetype plugin
filetype plugin on
filetype indent on
"Set to auto read when a file is changed from the outside
set autoread
"Have ...
原文地址: http://coolshell.cn/articles/656.html
可能很少有人意识到,在一个进程调用了exit之后,该进程 并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种, ...
一 信号的种类
可靠信号与不可靠信号, 实时信号与非实时信号
可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号
不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于
SIGRTMIN的都是非可靠信号.
非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信
号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值
位于 [SIGRTMIN, SIGRTMAX] 区间的都是可靠信号.
关于可靠信号, 还可以参考WIKI的一段话:
...
一 应用场景
有很多业务, 客户端和内网都要进行数据传输和交换, 现有架构中, 客户端不能直接访问内网,
那么客户端只能: 先把数据保存到外网服务器, 然后内网服务器再拉回来处理. 这种方式可以保证数据
都能被处理, 但实效性不够.
通常, 外网服务器只起到一个暂时保存数据的作用, 保存客户端报上来的数据, 然后等待内网来拉走,
把客户端看做producer, 内网看做consumer, 这正是消息队列的用武之地.
客户端先把数据写入外网服务器的消息队列, 然后内网服务器再从消息队列取走数据, 消息队列须满足:
(1) 支持高并发的入队和出队操作, 允许很多客户端 ...
#include <stdio.h>
/*
* Copy src to string dst of size siz. At most siz-1 characters
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
int strlcpy(char *dst, const char *src, int siz)
{
register char * ...
最近做一个收集客户端数据的项目, 后台使用nginx, 通过实现nginx的模块来处理业务. nginx的模块编写不难,
但写完后对nginx的内部机制还是云里雾里, 趁周末好好阅读一下nginx的源代码. 下面记录一些阅读过程中遇
到的数据结构. 关于nginx的内部实现, 等看懂了源码再写.
模块四要素:
1 模块实例, 2 模块上下文, 3 模块指令, 4 指令参数
模块定义
===================================================
struct ngx_module_s {
ngx_uint_ ...
ctags用来跳转, taglist用来列出当前文件的变量, 函数, 宏. cscope用来查找符号
一 使用ctags
1 在源码目录创建tag文件
cd /home/kenby/project/nginx-1.0.0/src
ctags -R
2 打开一个文件
gvim core/ngx_string.c
把光标移到变量名或函数名上,然后按下"Ctrl-]"。用"Ctrl-o"退回原来的地方。
二 使用taglist
打开一个文件, 并输入命令, vim就会产生一栏显示该文件的变量和函数
gvim core/ ...