1、memcah 是半同步/半异步的网络模型

2、主线程创建多个之线程worker,没个子线程有自己的消息循环和事件处理,每个之线程有一个自己的epoll模型
3、主线程与worker之间有一条对应的管道进行通信,主线程可以向管道i中写数据进行与之线程通信。每个之线程监听自己的管道。
\
半同步/半异步模型的工作流程:主线程负责监听进程对外的TCP监听端口。当客户端申请连接connect到进程的时候,主线程负责接收accept客户 端的连接请求。然后主线程选择其中一个worker线程,把客户端fd通过对应的管道传给worker线程。worker线程得到客户端的fd后负责和这 个客户端进行一切的通信。
memcached里面的半同步/半异步和上面所说的差不多,区别在于:1.  memcached使用libevent作为进行事件监听;2.memcached往管道里面写的内容不是fd,而是一个简单的字符。每一个worker 线程都维护一个CQ队列,主线程把fd和一些信息写入一个CQ_ITEM里面,然后主线程往worker线程的CQ队列里面push这个CQ_ITEM。 接着主线程使用管道通知worker线程:“我已经发了一个新客户给你,你去处理吧”。

\

 
每一个线程都有LIBEVENT_HEAD的结构体,主线程中保存了一个threads的指针,通过向管道中写入数据进行通信



4、CQ_ITEM内存此池
memcached在申请一个CQ_item结构体的时候并不是直接分配内存,这样做会长造成大量的垃圾碎片,采用内存池。

worker线程对于管道可读事件的回调函数是ethread_libevent_process函数。主线程对于socket fd可读事件的回调函数是event_handler函数。conn结构体成员state的值为conn_listening
posted on 2015-09-10 10:26  自由恶魔  阅读(355)  评论(0)    收藏  举报