`
kenby
  • 浏览: 716803 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表

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聊天室

    博客分类:
  • web
web 聊天室支持多人在线聊天,某个人发了一条消息,在线的所有人都能实时看到。   tornado 自带的 demo 演示了如何实现一个 web 聊天室, 通过源码,我总结一下它设计方案。 服务器端 维护一个消息缓存,用来保存所有人发的消息。 维护一个等待队列,用来保存等待新消息的用户。 如下图所示: (1) 添加消息 服务器把用户发送的消息加入消息缓存,同时唤醒等待队列中的用户, 告诉它们把最新的消息取走。 (2) 推送消息给用户 服务器与用户保持长连接,如果用户的 cursor 到达了消息缓存的末尾,说明 服务器暂时没有最新的消息,这时让用户一直等待,等待 ...

守护进程的实现

6个步骤   步骤1:创建子进程,杀死父进程,目的是为了步骤2中调用setsid可以成功。   步骤2:创建新会话,并自任组长。目的是脱离控制终端                会话组长调用 setsid 会失败,步骤1创建的子进程必然不是会话组长,                这就保证了 setsid 可以成功。   步骤3:修改工作目录为根目录。               当进程没有结束时,工作目录是不能卸载的,为了防止这种情况,               把工作目录设为根目录。因为根目录一般是不用卸载的。   步骤4:修改文件权限掩码,很多情况下,守护进程会创 ...
步骤1: 设置非阻塞,启动连接 实现非阻塞 connect ,首先把 sockfd 设置成非阻塞的。这样调用 connect 可以立刻返回,根据返回值和 errno 处理三种情况: (1) 如果返回 0,表示 connect 成功。 (2) 如果返回值小于 0, errno 为 EINPROGRESS,  表示连接       建立已经启动但是尚未完成。这是期望的结果,不是真正的错误。 (3) 如果返回值小于0,errno 不是 EINPROGRESS,则连接出错了。   步骤2:判断可读和可写 然后把 sockfd 加入 select 的读写监听集合,通过 select 判 ...
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就派上用场了。典型的例子包括 ...
描述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)就是, ...
"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) 支持高并发的入队和出队操作, 允许很多客户端 ...

strlcpy实现

    博客分类:
  • c
#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源码阅读笔记

    博客分类:
  • c
  最近做一个收集客户端数据的项目, 后台使用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/ ...
Global site tag (gtag.js) - Google Analytics