背景(饥饿问题)
使用epoll ET模式时, epoll_wait返回就绪文件描述符集合, 然后我们循环处理, 但这时如果有一个文件描述符上有大量输入(不间断的输入流), 因为我们ET模式需要一直读到返回EAGIN / EWOULDBLOCK, 那我们就会一直在处理这个文件描述符, 而导致其他文件描述符得不到处理,
这就是采用边缘触发时有可能出现的文件描述符饥饿情况
处理方法
参考Linux/Unix系统编程手册 63.4.6 节(第1123页)
- 应用层维护一个list, 存储epoll_wait返回的就绪文件描述符, 然后循环处理
- 在list不为空时, 进行循环处理其中事件
- 每个文件描述符只进行一定限度的 IO 操作, 比如每次限定只读 1KB 数据, 然后继续处理其他的文件描述符
- 如果该文件描述符读了 1KB 没读完 (没有返回EAGIN / EWOULDBLOCK), 就继续停留在list中, 反之如果其上的 IO 操作执行完了, 就将其移除list
在Linux的epoll事件驱动编程中,边缘触发(ET)模式可能导致文件描述符饥饿现象,即一个高流量的文件描述符占用过多处理时间,导致其他文件描述符得不到及时响应。为了解决这个问题,可以采取应用层维护就绪文件描述符列表的策略,限制每次对每个文件描述符的IO操作,例如每次读取1KB,确保所有文件描述符都有机会被处理。当文件描述符未读完时,将其保留在列表中,待后续处理。
3293

被折叠的 条评论
为什么被折叠?



