多路IO复用模型——epoll模型


一、epoll模型是什么?

epoll模型是整合了select和poll优势,并且优化了已知的问题。
使用红黑树作为监听集合(监听树)
通过epoll_create创建该监听树,返回值为指向树的描述符。
参数:树的大小。
监听树的访问操作:epoll_ct。
第一个参数是树的描述符,第二个参数是树的添加修改和删除的关键字,第三个参数是sock的值。(因为将sock的值当成索引编号)
注:此处的修改只能修改事件,因为sock与Index索引是一致的。

二、epoll模型工作流程

epoll模型与select和poll最大的区别就是没有轮询了。
监听改为:异步操作
让监听树(sock)与网络设备绑定
但其实epoll也是有监听队列的,不过是自己在内核层中实现的。称为epoll等待队列。(不是轮询,体积更小,效率更高)
监听树上的节点在进入监听队列中都会被包裹为监听项或就绪项,再与网络设备绑定。如果有人开始发数据,网卡会第一时间知道并给等待队列发一个通知(就绪通知),而且还会告诉是谁就绪了。
树节点中还有一个隐式成员:回调函数。
就绪通知发回过来,这个回调函数就会执行,然后将自己弹出至就绪链表(双向链表)。可以理解为自己知道自己就绪了。
就绪链表中存储着就绪节点,但是这个链表在内核层,所以会将这个链表拷给用户空间,在其中会变为就绪数组

如果是添加,则会将首元素(也就是1)删除,其余元素依次前移,新元素添加到尾部。

三、epoll模型优缺点

优点:

  1. epoll不用担心轮询问题, 所以没有监听限制, 可以监听系统最大描述符数量, 并没有多余开销。
  2. epoll并不存在轮询问题, 无需担心监听数量增大,系统开销增大。
  3. epoll监听到就绪直接返回就结节点,(sock) 用户遍历处理这些sock即可。
  4. epoll直接返回就绪的sock,用户直接处理即可
  5. epoll监听集合在内核层, 所以不会出现重复拷贝和重复挂载的问题,保证每个节点只拷贝一次, 只挂载一次。
  6. epoll与poll一样,监听的事件更丰富, 而后设置监听比较灵活,可以对不同的sock设置不同的事件监听。

缺点:

  1. 系统限制,windows系统无法使用。
  2. 因为底层为红黑树,所以红黑树的缺点也是它的缺点。

四、水平触发(LT)和边缘触发模式(ET)

水平触发(LT)

LT是默认的工作模式,对于采用LT的文件描述符,在水平触发模式下,如果某个文件描述符上有数据可读,内核会持续通知应用程序,直到应用程序处理完数据或者缓冲区不再有数据可读为止。

边缘触发模式(ET)

在边缘触发模式下,只有在文件描述符状态变化(对于EPOLLIN事件,只有在状态从未就绪变化为就绪,才叫做变化)发生时才会触发事件


总结

监听能力上:epoll碾压select和poll。
处理能力上:跟监听能力无关,所以他三一样。
所以:
监听部分:通过IO复用技术监听管理有效连接。
处理部分:并发处理,快速反应。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力找工作的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值