epoll的两种触发模式ET、LT
EPOLL事件分发系统可以运转在两种模式下:Edge Triggered (ET)、Level Triggered (LT)。
epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式。
通过上图epoll的工作流程描述,可以看出 ET模式和LT模式的区别主要发生在第5步:是否将文件描述符fd放回rdlist中,而rdlist的是否为空决定了epoll_wait函数的阻塞和非阻塞。
EPOLL在ET模式下会被触发多次么
ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高。epoll工作在ET模式的时候,必须使用nonblocking socket,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。
ET可以减少epoll事件被重复触发的次数,效率比LT高。 如果需要设置为边缘触发只需要设置事件为类似 ev.events=EPOLLIN | EPOLLET 即可。
ET模式很大程度上减少了epoll事件的触发次数,因此效率比LT模式下高。一张图总结一下select,poll,epoll的区别:epoll是Linux目前大规模网络并发程序开发的首选模型。在绝大多数情况下性能远超select和poll。
边缘触发模式下事件就绪只会通知一次,为了保证数据成功被读取或写入,在非阻塞模式下,采用循环的方式进行读写,直到完成或出现异常时退出。
通过上图epoll的工作流程描述,可以看出 ET模式和LT模式的区别主要发生在第5步:是否将文件描述符fd放回rdlist中,而rdlist的是否为空决定了epoll_wait函数的阻塞和非阻塞。
EPOLLHUP: 表示对应的文件描述符被挂断; EPOLLET:将EPOLL设为边缘触发(EdgeTriggered)模式,这是相对于水平触发(Level Triggered)来说的。
Epoll的使用详解
首先通过 create_epoll(int maxfds) 来创建一个epoll的句柄,其中 maxfds 为你epoll所支持的最大句柄数。这个函数会返回一个新的epoll句柄,之后的所有操作将通过这个句柄来进行操作。
epoll是select和poll的改进版本,更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
epoll API可以使用edge-triggered和level-triggered两种接口,并且可以高性能的同时监视大量的fd,这是对epoll相对鱼poll的核心优势。
调用者可以设定EPOLLONESHOT标志,在 epoll_wait(2)收到事件后epoll会与事件关联的文件句柄从epoll描述符中禁止掉。因此当EPOLLONESHOT设定后,使用带有 EPOLL_CTL_MOD标志的epoll_ctl(2)处理文件句柄就成为调用者必须作的事情。
epoll的两种触发模式分别是ET(edge trigger)边缘触发和LT(level triggered)水平触发。epoll的默认触发模式是LT,select、poll都是LT触发。缓冲区只要有数据未读就会导致epoll_wait返回。上次读数据未读完仍会导致epoll_wait返回。