即Level-Triggered and Edge-Triggered
简单说来
Level-Triggered:
只要事件是处于就绪状态,你每询问一次,就告诉你一次它处于就绪状态。
Edge-Triggered:
只有在状态改变的时候告诉你,这也是为什么et模式下,建议用非阻塞的socket。
下面我们来看看epoll对于两类触发是怎么返回给用户的。
当用户调用epoll_wait时会返回一组事件,包括水平触发的或边缘触发的。
epoll中有两个重要的数据结构红黑树rbt,和一个就绪列表ready-list。
调用epoll_wait时其实就是从ready-list中拿数据,
一般说来从ready-list中每拿一个事件就删除一个事件,
但如果拿到的事件是水平触发,它会放回read-list。
这是一个很巧妙的操作!
这样下次再取到这个事件的时候只要判断一下该事件是否还有效就可以了。
这样对于内核中其他地方来说,它们对于epoll只要有边缘触发的概念就好了。
网络IO什么的,只要在状态改变的时候,告诉epoll就OK了。
而在epoll内部,它自己区分边缘和水平,并呈现给用户。
具体参见linux内核源码。