epoll与selector的简单理解


概念理解

selector与epoll是多路复用的函数。我认为多路复用是针对bio而言,指的是通过单线程来追踪管理多个socket对象。传统的bio中,在socket的accept与read两个阶段都会造成阻塞,那么就无法处理并发问题,即仅一个socket对象就已经占用了IO对象,没有余力解决其他线程的请求。那么如何让bio能够处理并发问题呢?就是在accept和read阶段不再阻塞,当accept到socket对象的时候就将其缓存至list中,同时如果read到数据了就处理数据。但如果没有accept对象,则会去list中询问以前accept的对象有没有需要read的数据。如此,通过一个线程完成了多个socket对象的管理。那么selector与epoll就是完成了上述功能。

对比分析

selector内部维持了一个数据结构(bitmap),用来存储已经接受的socket对象。然后将此数据复制一份,交给内核去轮训每个socket对象是否有期待的事件发生,如果有就会进行置位(用户态到内核态的复制)。然后返回给用户态,由用户态完成事件的处理。

 

epoll针对selector进行了优化,采用红黑树来存储accept的socket对象,同时还维持着一个list,存放有发生的事件的socket以及事件,然后将此任务队列返回。用户态无需遍历所有的socket对象。下图即为epoll的说明图。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM