背景(饥饿问题)
使用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