网络连接与处理模型
2015-03-11 18:39:01 0 举报
memcached的网络连接模型及线程间通信方式
作者其他创作
大纲/内容
iovec
从CQ队列取出待处理的fd,并通过libevent处理该fd上的读写事件
worker thread
conn*
char*
0
目前已分配rsize个字节
struct iovec* iov真正指向待发送数据的iovec数组
main thread
msg
char** suffixlist存放cas_id的小块内存的指针列表
CQ队列
...
分配了容纳iovsize个iovec结构的空间
int state请求已进入哪个处理阶段?
accept
conn实例
1. 通过Round Robin轮询选择worker thread,并将accept返回的fd封装成CQ_ITEM后push到该线程的CQ队列中
item*
conn* freeconns
listen
int fsdsocket连接句柄
Libevent
item** ilistget请求要返回的item列表
分配了容纳suffixsize个指针的空间
freetotal - 1
分配了容纳isize个指针的空间
还有suffixleft个未处理
2. 向该线程pipe写数据,触发读事件
item** icurr下一个待处理的item指针
1个message对应多个iovec,1个iovec指向一段待发送的字节流
分配了容纳msgsize个msghdr结构的空间
char* rcurr请求数据已被解析到哪里?
已读取rbytes个字节
char* wbuf写缓冲区
先从空闲队列中取CQ_ITEM,不够用再一次性分配一批侯用
已使用iovused个空间
char* freesuffix[freetotal]
dispatch
处理完的CQ_ITEM扔回空闲队列
freecurr
char** suffixcurr下一个待处理的suffix字符串
struct msghdr* msglist待发送的message数组
CQ_ITEM* cqi_freeconnlist
已使用msgused个空间
char* rbuf读缓冲区
char* wcurr待发送数据已处理到哪里?
还有ileft个item待返回
0 条评论
下一页