epoll的两种工作模式LT ET

epoll的两种工作模式LT ET

前言

之前已经介绍过了epoll的工作机制,以及它和selectpoll之间的区别,传送门:https://blog.csdn.net/lyn_00/article/details/84839673
接下来我们详细介绍一下它的两种工作模式。

LT(level triggered)

LT模式,也叫做水平触发模式。在该模式下,当有事件发生并调用epoll_wait后,若未及时处理,下一次调用epoll_wait仍会继续通知。
内部实现方法:将从rdlist上取出的事件重新放回去,再次调用epoll_wait仍会继续通知,直到用户处理完成主动关闭fd。
在该模式下有两种工作方式:阻塞和非阻塞。
自认为这两种工作方式并没有很明显的区别,因为只要被唤醒就一定有事件可读或者可写,阻塞模式下,一般情况并不会进入阻塞状态。在非阻塞模式下,会使用循环的方式进行读/写,直到完成或出现异常循环退出。

ET(edge trigger)

ET模式,也叫边缘触发模式,其与水平模式的区别就是,调用epoll_wait通知过的事件,不论是否经过处理,再次调用epoll_wait不会再次通知了,ET模式在很大程度上降低了同一个epoll事件被重复触发的次数,因此ET模式效率比LT模式高。
内部实现方法:调用epoll_waitrdlist取出事件后就不会再放回。
ET模式下推荐使用非阻塞,我在这件事情上面纠结了很久,为什么阻塞就不行呢?网上给出的答案也都模棱两可,说阻塞模式下可能会造成永久阻塞,但是又不说明情况。思考后我的理解是这样的:

  • 非阻塞模式:在ET模式下,因为事件只会被通知一次,为了保证数据成功被读取或写入,在非阻塞模式下,采用循环的方式进行读写,直到完成或出现异常时退出。
  • 阻塞模式:如果不采用循环的方式进行读写,就会造成数据读/写不完的情况,因为下一次再调用epoll_wait就不会再通知了,如果尝试采用循环的方式进行读写,则会造成永久阻塞。
    造成阻塞的原因只有没有数据可读/可写,在非阻塞模式下出现没有数据可读/可写可以返回相应的错误信息,但是阻塞模式就会进入阻塞状态,而处理的该fd永远也不可能再有可读数据了,所以就被永久阻塞了。
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值