Epoll之ET、LT模式

原创 2013年12月02日 18:35:19

Epoll之ET、LT模式

在使用epoll时,在函数 epoll_ctl中如果不设定,epoll_event 的event默认为LT(水平触发)模式。

使用LT模式意味着只要fd处于可读或者可写状态,每次epoll_wait都会返回该fd,这样的话会带来很大的系统开销,且处理时候每次都需要把这些fd轮询一遍,如果fd的数量巨大,不管有没有事件发生,epoll_wait都会触发这些fd的轮询判断。

         在ET模式下,当有事件发生时,系统只会通知你一次,即在调用epoll_wait返回fd后,不管这个事件你处理还是没处理,处理完没有处理完,当再次调用epoll_wait时,都不会再返回该fd,这样的话程序员要自己保证在事件发生时要及时有效的处理完该事件。例如:fd发生了IN事件,在调用epoll_wait后发现了该时间,程序员要保证在本次轮询中对该fd做了读操作,且还要循环调用recv操作,直到读到的recv的返回值小于请求值,或者遇到EAGAIN错误,否则,在下次轮询时,如果该fd没有再次触发事件,你就没有机会知道这个fd需要处理。这样就会增加程序员的负担和出错的机会(可能有些数据没有来得及处理,丢失数据)。

         在LT模式下,无论fd是否有事件发生,或者还有一些事件没有处理完,每次调用epoll_wait时,总会得到该fd让你处理(只要有没事件没有处理,会一直通知你处理,直到你处理完为止,这样就保证了数据的不丢失)。

         操作系统在LT模式下维护的就绪队列大小相对于ET模式肯定大,且LT轮询所有的fd总比ET轮询的fd大。自然在性能上LT不如ET,但是在使用ET模式的时,需要循环调用recv,send等处理函数,得保证其事件处理完毕,这样也会带来开销且容易出错。

从 kernel 代码来看,ET/LT模式的处理逻辑几乎完全相同,差别仅在于 LT模式在 event 发生时不会将其从 ready list 中移除,略为增大了event 处理过程中 kernel space 中记录数据的大小。

 

总结:

1. epoll 的 ET和 LT 模式处理逻辑差异极小,性能测试结果表明常规应用场景中二者性能差异可以忽略。
2. 使用 ET 的程序比使用LT 的逻辑复杂,出错概率更高。
3. ET 和LT 的性能差异主要在于 epoll_wait 系统调用的处理速度,是否是程序的性能瓶颈需要视应用场景而定,不可一概而论。

         个人建议使用LT模式

 

 

参考资料:

http://www.cppblog.com/peakflys/archive/2012/08/26/188344.aspx

http://www.cppblog.com/Leaf/archive/2013/02/25/198061.html

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Linux网络编程——tcp并发服务器(epoll实现)

通过epoll实现tcp并发回执服务器(客户端给服务器发啥,服务器就给客户端回啥) 代码如下: #include #include #include #include #include #...

epoll的ET和LT模式详解

从man手册中,得到ET和LT的具体描述如下EPOLL事件有两种模型:Edge Triggered (ET)Level Triggered (LT)假如有这样一个例子:1. 我们已经把一个用来从管道中...

epoll ET/LT 触发方式的性能差异

剖析 epoll ET/LT 触发方式的性能差异误解(定性分析) 平时大家使用 epoll 时都知道其事件触发模式有默认的 level-trigger 模式和通过 EPOLLET 启用的 edge-...

EPOLL LT和ET区别

原帖:http://www.vimer.cn/2009/10/epoll%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.html sel...

处理大并发之二 对epoll的理解,epoll客户端服务端代码

处理大并发之二 对epoll的理解,epoll客户端服务端代码 序言: 该博客是一系列的博客,首先从最基础的epoll说起,然后研究libevent源码及使用方法,最后研究nginx和node.js,...

epoll服务端与客户端代码实例(复制即用)

服务端: #include #include #include #include #include #include #include #include #inclu...

努力吧,现在也不晚(目前唯一一个转载文章,用于激励自己)

努力吧,现在也不晚 来自http://blog.csdn.net/shuaihj/article/details/8586101 或许这再一次印证任何人每一次的成功背后都有不为人知的付出和汗水。   ...

socket编程 -- epoll模型服务端/客户端通信的实现

本例实现如下功能: 支持多客户端与一个服务端进行通信,客户端给服务端发送字符串数据,服务端将字符串中小写转为大写后发送回客户端,客户端打印输出经转换后的字符串。 例如:发送abcde,打印输出AB...

“而立之年”码农之“IT江湖”

时光荏苒,岁月如梭,不经意间已浪迹IT江湖三年有余,转眼进入而立之年,在此对自己闯荡江湖做个总结,还请各位前辈指教。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)