epoll 的 Edge Trigger 和 Level Trigger 理解(linux)

epoll 的 Edge Trigger 和 Level Trigger 理解

Stackoverflow 上有个问题讨论了这个话题:

http://stackoverflow.com/questions/9162712/what-is-the-purpose-of-epolls-edge-triggered-option


Level Trigger 就是在描述符就绪的时候,内核会持续地通知进程,直到进程处理描述符,但是有时候我们并没办法第一时间就去处理这个描述符,所以内核的持续通知会浪费系统资源。

Edge Trigger 与 LT 不同,内核在描述符就绪的时候只会通知进程一次,进程可以在合适的时候再处理它。当error变成EAGAIN 时,就可以等待内核下一次的通知了

ET模式仅当状态发生变化的时候才获得通知,这里所谓的状态的变化并不包括缓冲区中还有未处理的数据,也就是说,如果要采用ET模式,需要一直read/write直到出错为止,很多人反映为什么采用ET模式只接收了一部分数据就再也得不到通知了,大多因为这样,而LT模式是只要有数据没有处理就会一直通知下去的。

epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。最好以下面的方式调用ET模式的epoll接口 

    基于非阻塞文件句柄 
    只有当read(2)或者write(2)返回EAGAIN时才需要挂起,等待。但这并不是说每次read()时都需要循环读,直到读到产生一个EAGAIN才认为此次事件处理完成,当read()返回的读到的数据长度小于请求的数据长度时,就可以确定此时缓冲中已没有数据了,也就可以认为此事读事件已处理完成。 

POSIX.1 要求,对于一个非阻塞的描述符如果无数据可读,则read返回-1,同时 errno 被设置为 EAGAIN
————————————————
版权声明:本文为CSDN博主「amghost」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/amghost/java/article/details/22979829

posted @ 2020-04-03 10:41  scott_h  阅读(504)  评论(0编辑  收藏  举报