epoll 的LT和ET模式的区别

很多人都谈论LT和ET效率的问题, 这个问题我们放到最后去谈。

先看看触发模式和设计上的区别, 以及编码上的区别。

触发模式设计上的区别

LT模式是电平触发(Level Trigger), 有消息的时候就会触发, 只要一直有消息, 就一直是触发状态。

ET模式是边沿触发(Edge Trigger), 只有消息从无到有才会触发。比如从不可读到可读, 从不可写到可写, 并且只通知一次。 就是通知你一次之后, 一直处于可读状态, 那么就不会通知你, 只有再从不可读到可读才会再次通知你。

区别在哪?

举个栗子: 当同时有套接字可读, 也就是说同时来个是个消息, 此时你处理了五个, 你就去epoll_wait了, 如果是LT模式, 会立刻返回, 返回的是你没有处理的那五个, 如果是ET模式呢, 不会返回没处理的那五个, 因为状态没有从不可读变为可读。

编码上的区别

触发模式上的区别我们可以知道, 如果来了大量的请求, 我们一次能处理完的时候, LT模式下完全可以不管, 直接再次epoll_wait就可以, 因为下次他还会返回那些没有处理的事件, 因为我们没读, 所以数据依然在, 依然可读。但是在ET模式下, 就需要把所有的可读事件全部处理完, 或者使用一个ready_queue的数据结构, 暂时保存一下, 稍后处理, 因为如果不保存, 你就不知道哪些是没有处理的, 或者需要处理的。 这就出现了一个差别, ET模式需要多一个容器去保存尚未处理的事件, 编程比LT更复杂。

同样在LT模式下, 如果一次没有处理完, 下次调用epoll_wait的时候会立刻返回, 多进行了系统调用。返回次数也比ET模式多, 因此很多人认为ET模式比LT模式高效。

真的高效吗?

LT模式比ET模式系统调用次数多, 但是ET模式多用了memory和时间去保存和维护尚未处理的事件。 具体哪个高效我不能给出定论, 因为有可能自己去维护这个任务队列的时候花费的时间更多, 因为这个维护是程序员自己去写的。 ET比LT高效, 只是相对于它自己来说, 而不是相对于整个系统来说的。具体的情况还需要结合实际去分析。

可能我有理解的不到位或者不对的地方, 恳请各位指正, 谢谢!
欢迎大家就此问题展开讨论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值