epoll的LT和ET模式

Linux下实现I/O复用的三种系统调用有select、poll、epoll。相比于select和poll,epoll的效率更高。其原因有两点:一是epoll使用一组函数来为完成系统调用;二是epoll把用户关注的文件描述符上的事件放在内核内的一个事件表中,而无需每次调用向内核重复传入。其实还有一点原因在epoll的内核剖析中,我们会发现,epoll是通过红黑树维护文件描述符,而poll是通过链表的形式保存文件描述符,所以在内核的执行效率上epoll比poll更好一些。但这些都不重要,我们今天主要介绍epoll的LT和ET模式。
epoll对文件描述符的操作有两种模式,分别是LT模式(电平触发)和ET模式(边沿触发)。其中LT模式,是默认的工作模式。
先来看看LT模式

LT模式

**在LT模式下,epoll_wait将事件返回给应用程序,应用程序可以不立即处理事件,则下一次epoll_wait还会将该事件通知给应用程序,直到应用程序处理该事件。**在这种模式下,epoll相当于一个较高效的poll。

ET模式

当用户向内核事件表中注册一个文件描述符上的事件为EPOLLLET事件时,epoll将以ET模式来操作该文件描述符。ET模式下,epoll_wait将事件返回给应用程序,应用程序必须立即处理该事件,如果应用程序不处理该事件,则下次epoll_wait不会再向应用程序通知该事件。ET模式大大降低了同一个epoll事件被重复触发的频率,因而效率比LT模式高。

强调一点,任何使用ET模式下的文件描述符都要是非阻塞的,如果文件描述符是阻塞的,那么读和写操作将会因为没有后续的事件而一直处于阻塞状态。

LT模式和ET模式的区别:

  1. 从使用来看,LT模式下,时间就绪后,如果应用程序并没有及时处理完该事件,则下次还会被通知给应用程序;ET模式下如果就绪事件被通知给应用程序而没有被处理或处理完,则下次不会再通知应用程序程序处理该事件;
  2. 从内核实现上,epoll的epoll_wait函数检测内核链表rdlist是否为空,不为空则将rdlist中的节点移动到txlist中(移动完成后rdlist为空),接着遍历txlist中的每个节点,查看事件是否就绪,如果就绪就拷贝给epoll_wait调用时传递的用户数组上。LT模式下,接着还会用户关注的事件从txlist中拷贝回rdlist;对于ET模式,则不会将事件拷贝回rdlist,下次epoll_wait调用不会知道之前就绪的事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值