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 @   scott_h  阅读(545)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示