分类: LINUX
2010-01-08 11:58:40
最近看看了memcached的源码,觉得里面的一些设计理念很不错,在此做个笔记,以便日后查看。
一、memcached启动流程
memcached的注释上说取消stderr缓冲的目的是为了在daemontools等工具下运行。
时钟时间仅仅是不停更新的一个时间变量,以避免程序不停的调用time()。
二、线程模型
主线程accept到连接之后,按顺序分配给各个线程。利用管道来通知。
三、核心函数driver_machine
driver_machine把平常的函数调用,例如listen后,需要write;或者read后需要write之类统统通过循环和state,把他们放到一个函数里面。个人认为这样可以减少很多函数调用,即使减少了很多进栈出栈的时间。
conn_listening:新连接事件
conn_waiting:实际修改事件的地方
conn_read:读数据
conn_parse_cmd:解析命令
conn_new_cmd:新命令
conn_nread:继续读
conn_swallow:继续读,并且丢弃这些数据
conn_write:写数据
conn_mwrite:继续写
conn_closing:关闭
conn中有个write_and_go,用于write之后设置conn的状态。
四、assoc(hashmap)
assoc扩容是,并不是立刻扩容,而是让扩容的操作在另外一个线程中进行。这样做的目的可能是为了保证本次请求的及时响应吧。因为有可能本次操作导致assoc需要扩容,但有没有后续的请求了,该方式可以使得本次请求能够最快的速度返回。