当前位置: 技术问答>linux和unix
求推荐Linux下利用epoll实现大规模并发服务器架构设计与实现方面的论文or书籍。
来源: 互联网 发布时间:2017-03-21
本文导语: 最近因为需要,随着考虑的深入,并发性的要求提高,框架必须划分读,处理,写,三部分逻辑,配合线程池,内存池,环形队列,epoll实现高并发服务器。 实现中,发现还是有一些地方要做特别的同步处理。 比如...
最近因为需要,随着考虑的深入,并发性的要求提高,框架必须划分读,处理,写,三部分逻辑,配合线程池,内存池,环形队列,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待写出队列,不过要有序号问题。
明天再写。。。哪里不对,请高人立即指正,谢谢。
实现中,发现还是有一些地方要做特别的同步处理。
比如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待写出队列,不过要有序号问题。
明天再写。。。哪里不对,请高人立即指正,谢谢。
|
不如直接看看nginx源码,多进程单线程 epoll
|
呵呵,你试着找找看 cwinux 的说明,好像和你要做的事情非常接近.
epoll好像有边沿触发模式,你说的问题大概能避免.
epoll好像有边沿触发模式,你说的问题大概能避免.