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

 

 

 

epoll使用详解(精髓)

epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是e...
  • ljx0305
  • ljx0305
  • 2009年04月11日 16:34
  • 208827

【服务器编程】EPOLL的LT和ET模式的区别和理解

【前言】 epoll模型是服务器编程的高性能框架,比select 和 poll模型高效很多,当然还有其它的模型,如kqueue等,具体linux发行版提供不同的模型,一般都支持epoll吧。 ...
  • Jammg
  • Jammg
  • 2016年07月07日 23:05
  • 4960

epoll在LT和ET模式下的读写方式

在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是: * EAGA...

epoll在ET和LT模式下读写

epoll在ET和LT模式下读写 2014-03-12 17:49:05 分类: C/C++ 在一个非阻塞的socket上调用read/write函数, 返回E...

Epoll在LT和ET模式下的读写方式

在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次,...
  • weiqubo
  • weiqubo
  • 2015年02月10日 00:35
  • 1417

epoll的LT和ET模式

转载自:http://kenby.iteye.com/blog/1162853 epoll的两种模式 LT 和 ET 二者的差异在于 level-trigger 模式下只要某个 soc...

epoll模型中LT、ET模式分析

水平触发(level-triggered,也被称为条件触发)LT: 只要满足条件,就触发一个事件(只要有数据没有被获取,内核就不断通知你) 边缘触发(edge-triggered)ET: 每当状态变...

Epoll在LT和ET模式下的读写方式

原文地址: http://www.ccvita.com/515.html 在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注:...

epoll ET LT模式详细

“EPOLLET”就是ET模式的设置 struct epoll_event struEvent; struEvent.events = EPOLLIN | EPOLLOUT | EPOLLET; st...
  • cws1214
  • cws1214
  • 2013年08月01日 19:20
  • 823

epoll中ET和LT模式的区别

#include #include #include #include #include #include #include #include #include #include
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Epoll之ET、LT模式
举报原因:
原因补充:

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