LT和ET模式
epoll对文件描述符的操作有2种模式: LT和ET
LT?? ?Level Trigger, 电平触发?? ?默认?? ?只有文件描述符号上有未处理的读写事件都会通知, 只要存在着事件就会不断的触发,直到处理完成 ET?? ?Edge Trigger, 边沿触发?? ?通过EPOLLET来设置?? ?当且仅当读写事件到来时通知, 只触发一次相同事件或者说只在从非触发到触发两个状态转换的时候儿才触发
LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表. 这种模式相当于一个效率高的poll
对于采用LT模式工作的文件描述符, 当epoll_wait检测到其上有事件发生并将此事件通知应用程序后, 应用程序可以不用立即处理该事件. 这样, 当应用程序下次调用epoll_wait时, epoll_wait还会再次向应用程序通告此事件,直到该事件被处理.
ET (edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述 符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致 了一个EWOULDBLOCK 错误)。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once),不过在TCP协议中,ET模式的加速效用仍需要更多的benchmark确认。
而当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时, epoll将以ET模式来操作该文件描述符, ET模式是epoll的高效工作模式. 对于采用ET模式工作的文件描述符, 当epoll_wait检测到其上有事件发生并将此事件通知应用程序后, 应用程序必须立即处理该事件, 因为后续的epoll_wait调用将不再向应用程序通知该事件.
可见, ET模式在很大程序上降低了同一个epoll事件被重复触发的次数, 因此效率比LT模式高. ?
|