我是靠谱客的博主 大力发卡,最近开发中收集的这篇文章主要介绍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高效, 只是相对于它自己来说, 而不是相对于整个系统来说的。具体的情况还需要结合实际去分析。

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

最后

以上就是大力发卡为你收集整理的epoll 的LT和ET模式的区别的全部内容,希望文章能够帮你解决epoll 的LT和ET模式的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部