目录
1.epoll的LT和ET模式介绍
2.epoll的ET模式如何处理
2.1 epoll的ET模式编程读取数据的处理方式
2.2 将描述符设置为非阻塞模式的方法
3.ET模式的总结
4.epoll的LT模式和ET模式总结
5.IO复用总结
1.epoll的LT和ET模式介绍
epoll对文件描述符有两种操作模式:
LT(Level Trigger,电平触发)模式
ET(Edge Trigger,边沿触发)模式。
LT 模式是默认的工作模式。当往 epoll 内核事件表中注册一个文件描述符上的 EPOLLET 事件时,epoll 将以高效的 ET 模式来操作该文件描述符。
2.epoll的ET模式如何处理
2.1 epoll的ET模式编程读取数据的处理方式
将描述符设置为 非阻塞模式 +循环读取数据
也就是ET模式下的描述符必须是非阻塞的
2.2 将描述符设置为非阻塞模式的方法
//ser_epoll_ET.c
#include <fcntl.h>void setnonblock(int fd)
{int oldfl=fcntl(fd,F_GETFL);int newfl=oldfl|O_NONBLOCK;if(fcntl(fd,F_SETFL,newfl)==-1){perror("fcntl error\n");}
}
3.ET模式的总结
ET模式下我们都需要做哪些事情?一共三点:
(1)添加事件类型的时候一定要添加上EPOLLET,这叫开启ET模式;;
(2)描述符要设置成非阻塞模式
(3)在IO函数返回以后,就是epoll_wait返回以后,它提醒我们描述符上有读事件产生了,我们要循环去处理;直到把这个描述符上的数据去处理完;然后再去处理下一个描述符;
所以就是说ET模式下的编程就要求我们的描述符必须是非阻塞模式
面试题:ET模式和LT模式编程有什么区别?
除了以上三点(1)(2)(3),还有一个最重要的区别:ET模式下的编程就要求我们的描述符必须是非阻塞模式
而LT模式阻塞或者非阻塞都可以,都不影响;
4.epoll的LT模式和ET模式总结
对于 LT 模式操作的文件描述符,当 epoll_wait 检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件。这样,当应用程序下一次调用 epoll_wait 时,还会再次向应用程序通告此事件,直到该事件被处理。
对于 ET 模式操作的文件描述符,当 epoll_wait 检测到其上有事件发生并将此事件通知应用程序后,应用程序必须立即处理该事件,因为后续的 epoll_wait 调用将不再向应用程序通知这一事件。所以 ET 模式在很大程度上降低了同一个 epoll 事件被重复触发的次数,因此效率比 LT 模式高。