标签:
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) |
标签:
原文地址:http://www.cnblogs.com/Juntaran/p/5902992.html