求推荐Linux下利用epoll实现大规模并发服务器架构设计与实现方面的论文or书籍。

qq120848369 2011-07-28 11:05:20
最近因为需要,随着考虑的深入,并发性的要求提高,框架必须划分读,处理,写,三部分逻辑,配合线程池,内存池,环形队列,epoll实现高并发服务器。

实现中,发现还是有一些地方要做特别的同步处理。

比如epoll先后监听到同一个SOCKET两次数据到来,第一次的读任务被加入队列,但还未执行,那么第二次的读任务如果也加入队列,之后两个任务被线程同时处理,都读同一个SOCKET就会有问题,所以这里我选择用mutex lock 住recvfrom,每一个线程里都是recvfrom到EWOULDBLOCK才退出。 这种情况下可以用ET模式,不会遗落未读数据。 这要求每一个SOCKET都要有自己的mutex保护recvfrom.

另外一种想法是LT模式,外加一个mutex保护的标记数组来保证一个SOCKET只有一个线程在读,虽然有一些时序问题,但以来LT模式"总是通知"的特点,时序问题就被忽略了,但Epoll却大量的返回造成主线程轮询。

再就是针对每一个SOCKET读到的数据,我考虑都放入每个SOCKET各自的数据队列中,并且有一个公用的任务队列用于通知处理线程该处理哪一个SOCKET的数据.

比如读线程读了一个报文,加该SOCKET对应的数据队列锁,将数据写入该SOCKET对应的数据队列,并加锁给公用待处理任务队列加入该SOCKET fd,唤醒一次处理线程。

这样,处理线程根据待处理任务队列就知道要读哪个SOCKET的数据队列,处理之后还是放到该SOCKET待写出队列,不过要有序号问题。

明天再写。。。哪里不对,请高人立即指正,谢谢。
...全文
765 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
requestImage 2012-11-07
  • 打赏
  • 举报
回复
顶。。。。000000000000000
qq120848369 2011-08-01
  • 打赏
  • 举报
回复
根据开源代码的框架,自己设计了一下,写了一个服务端.

每个线程拥有一个队列和一个管道,每个连接拥有2个管道和2个队列,每个线程处理的连接都是固定不变的,通过epoll管道来实现这个消息链。

不过看了几个源码的框架,貌似用event库的,用信号的都有,这个先不讨论了= =。
jsjygm 2011-07-31
  • 打赏
  • 举报
回复
学习来的。
昵称很不好取 2011-07-31
  • 打赏
  • 举报
回复
没搞过epoll,学习下,看来楼主实习的不错
fengzhw 2011-07-31
  • 打赏
  • 举报
回复
呵呵,你试着找找看 cwinux 的说明,好像和你要做的事情非常接近.

epoll好像有边沿触发模式,你说的问题大概能避免.
xiaohanhoho 2011-07-31
  • 打赏
  • 举报
回复
不如直接看看nginx源码,多进程单线程 epoll

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧