首页 > 代码库 > epoll

epoll

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

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

epoll