MEMCACHED(2) 网络线程模型

1  MEMCACHED的网络线程模型结构和之前公司的网游服务器底层很相似。

首先,主线程采用非阻塞ACCEPT,它也只干这一件事情,将新连接按照RR轮转,投递给一个工作线程;

投递的方法稍有蹊跷,将新连接PUSH到选定的工作线程的CQ队列中,该队列是线程安全的。

之后主线程往该工作线程所创建的PIPE中写入一个字节,借此唤醒工作线程,以处理新连接;

因为工作线程在启动之初,就创建了PIPE,并用EPOLL监视它的可读条件。

PS:该PIPE可以考虑用eventfd来替代,表现一样。

另外该CQ队列可以考虑作成LOCK_FREE的;不过也没太大必要,因为这里远远不是性能热点。

 

2 工作者线程将逻辑和IO揉和在一起了。

它监视网络事件,有数据到达,则进行解析并响应。

整个运作过程在drive_machine中实现。

注意conn_new_cmd分支,为了防止饿死,在一条连接上,最多处理50个请求,必须让出CPU。

假如还有请求没有处理完,但是数据已经被应用程序recv到了应用缓冲区;同时客户端在等待结果,并

不再发数据,那么,该连接将进入epoll_wait死等。

为了防止这样的情况,MEMCACHED采用了一个小伎俩:

临时为该连接注册OUT事件,那么epoll_wait将返回,重新进入conn_new_cmd分支,处理余下的请求。

直到所有请求都被处理后,才会取消OUT事件的监视。(在conn_waiting分支中取消的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值