一、epoll模型是什么?
epoll模型是整合了select和poll优势,并且优化了已知的问题。
使用红黑树作为监听集合(监听树)
通过epoll_create创建该监听树,返回值为指向树的描述符。
参数:树的大小。
监听树的访问操作:epoll_ct。
第一个参数是树的描述符,第二个参数是树的添加修改和删除的关键字,第三个参数是sock的值。(因为将sock的值当成索引编号)
注:此处的修改只能修改事件,因为sock与Index索引是一致的。
二、epoll模型工作流程
epoll模型与select和poll最大的区别就是没有轮询了。
监听改为:异步操作
让监听树(sock)与网络设备绑定
但其实epoll也是有监听队列的,不过是自己在内核层中实现的。称为epoll等待队列。(不是轮询,体积更小,效率更高)
监听树上的节点在进入监听队列中都会被包裹为监听项或就绪项,再与网络设备绑定。如果有人开始发数据,网卡会第一时间知道并给等待队列发一个通知(就绪通知),而且还会告诉是谁就绪了。
树节点中还有一个隐式成员:回调函数。
就绪通知发回过来,这个回调函数就会执行,然后将自己弹出至就绪链表(双向链表)。可以理解为自己知道自己就绪了。
就绪链表中存储着就绪节点,但是这个链表在内核层,所以会将这个链表拷给用户空间,在其中会变为就绪数组。
如果是添加,则会将首元素(也就是1)删除,其余元素依次前移,新元素添加到尾部。
三、epoll模型优缺点
优点:
- epoll不用担心轮询问题, 所以没有监听限制, 可以监听系统最大描述符数量, 并没有多余开销。
- epoll并不存在轮询问题, 无需担心监听数量增大,系统开销增大。
- epoll监听到就绪直接返回就结节点,(sock) 用户遍历处理这些sock即可。
- epoll直接返回就绪的sock,用户直接处理即可
- epoll监听集合在内核层, 所以不会出现重复拷贝和重复挂载的问题,保证每个节点只拷贝一次, 只挂载一次。
- epoll与poll一样,监听的事件更丰富, 而后设置监听比较灵活,可以对不同的sock设置不同的事件监听。
缺点:
- 系统限制,windows系统无法使用。
- 因为底层为红黑树,所以红黑树的缺点也是它的缺点。
四、水平触发(LT)和边缘触发模式(ET)
水平触发(LT)
LT是默认的工作模式,对于采用LT的文件描述符,在水平触发模式下,如果某个文件描述符上有数据可读,内核会持续通知应用程序,直到应用程序处理完数据或者缓冲区不再有数据可读为止。
边缘触发模式(ET)
在边缘触发模式下,只有在文件描述符状态变化(对于EPOLLIN事件,只有在状态从未就绪变化为就绪,才叫做变化)发生时才会触发事件
总结
监听能力上:epoll碾压select和poll。
处理能力上:跟监听能力无关,所以他三一样。
所以:
监听部分:通过IO复用技术监听管理有效连接。
处理部分:并发处理,快速反应。