码迷,mamicode.com
首页 > 其他好文 > 详细

epoll

时间:2016-09-24 13:29:11      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

windows走IOCP已经与我无缘了

Linux 则是epoll、select/poll

epoll_create创建一个epoll文件描述符,底层是一个红黑树和一个就绪链表

红黑树存储文件描述符节点数据  就绪链表存储就绪的文件描述符节点数据

epoll_ctl添加新的描述符,先判断红黑树有没有这个文件描述符节点

有->返回

没有->红黑树插入新节点,通知内核注册回调函数

当接收到某个文件描述符传入数据,内核把该节点插入到就绪链表

epoll_wait收到消息,数据拷贝到用户空间,清空链表

LT模式 电平模式

epoll_wait检查到文件描述符其上有事件发生并通知应用程序后,应用程序可以不立刻处理

这样应用程序下一次调用epoll_wait的时候,epoll_wait还会通知应用程序,直到被处理

在清空就绪链表后检查文件描述符是哪种模式,如果是LT && 该节点有事件未处理

则把该节点重新放入就绪链表,epoll_wait返回

ET模式 边沿触发

epoll_wait检查到文件描述符其上有事件发生并通知应用程序后,应用程序必须立刻处理

不检查

ET很大程度上降低了同一个epoll事件被重复触发的次数

 

select、poll、epoll区别

epoll检测到就绪的文件描述符后,触发回调函数,回调函数将该文件描述符上对应的时间插入内核就绪事件队列,再把器内容拷贝到用户空间

系统调用 select poll epoll
事件集合 通过3个参数分别传入感兴趣的可读、可写、异常等事件,内核通过对这些参数的在校修改反馈其中的就绪事件。每次调用selecet都要重置这3个参数 统一处理所有事件类型,只需传入一个事件集合参数。再通过pollfd.events传入感兴趣事件,内核通过修改pollfd.revents反馈其中就绪事件 内核通过管理一个事件表直接管理用户感兴趣的所有事件。每次调用epoll_wait的时候无需反复传入用户感兴趣事件。epoll_wait系统调用参数events仅仅用来反馈就绪的事件
应用程序索引文件描述符时间复杂度 O(n) O(n) O(1)
最大支持文件描述符数 一般有最大限制值 65535 65535
工作模式 LT LT LT/ET
内核实现和工作效率 轮询方式检测就绪事件,O(n) 轮询方式检测就绪事件,O(n) 采用回调方式检测就绪事件,O(1)

epoll

标签:

原文地址:http://www.cnblogs.com/Juntaran/p/5902992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!