在I/O复用多路转接的epoll模型下,会有两种工作模式,水平ET和边缘ET触发这两种。
LT水平触发模式
在epoll模型中,如果是LT的水平触发模式,如果事件是就绪的,会一直通知应用层去处理就绪事件,如果一直不处理,则一直是事件就绪的状态,应用程序需要反复检查文件描述符是否可读/可写,并且对于非阻塞IO操作,可能会返回EAGAIN错误。会造成资源的浪费。只要底层的事件没有处理完,就会一直有事件就绪。支持阻塞读写和非阻塞读写。
ET边缘触发模式
ET模式中,如果有事件从无到有,或有新事件的增加,调用epoll_wait的时候,通知到应用层,应用层进行处理,在ET模式中,对新的事件只会通知生产一次,下一次如果没有新事件的到来,即使事件的数据没有处理完,下次也不会在通知上层,只有新的事件到来,epoll_wait才会在一次大的通知。所以,使用ET模式迫使上层用户尽可能的把底层的事件处理完。支持非阻塞读写。因为epoll模型默认是LT模式,所以使用ET模式,就要将事件添加EPOLLET。
ET模式如何保证就绪的事件尽可能的完成(一次性获取底层的数据)
对于底层的数据,应用层循环获取,直到数据全部获取完毕,读取数据本质就是在进行I/O处理,epoll模型是单线程的程序,进行I/O处理必然会造成阻塞,所以添加事件时候,要把事件设置为非阻塞。ET模式让底层数据被应用层一次性获取,那底层的缓冲区的空间就更多,如果使用TCP的网络连接方式,epoll模型就会告知发送方可以接受跟多的数据(因为接受缓冲区的窗口更大),这样在通信的时候,就会提高吞吐量,提高效率。而且ET模式的通知都是有效的通知,不会像LT那样,只要有事件就一直通知,减少了通知上层的次数(就是减少调用epoll_wait的系统调用),提高效率。所以ET比TL更加的高效。