Linux :epoll ET 模式下文件描述符出现饥饿的情况

背景(饥饿问题)


        使用epoll ET模式时, epoll_wait返回就绪文件描述符集合, 然后我们循环处理, 但这时如果有一个文件描述符上有大量输入(不间断的输入流), 因为我们ET模式需要一直读到返回EAGIN / EWOULDBLOCK, 那我们就会一直在处理这个文件描述符, 而导致其他文件描述符得不到处理,

这就是采用边缘触发时有可能出现的文件描述符饥饿情况

处理方法


参考Linux/Unix系统编程手册 63.4.6 节(第1123页)

  1. 应用层维护一个list, 存储epoll_wait返回的就绪文件描述符, 然后循环处理
  2. 在list不为空时, 进行循环处理其中事件
  3. 每个文件描述符只进行一定限度的 IO 操作, 比如每次限定只读 1KB 数据, 然后继续处理其他的文件描述符
  4. 如果该文件描述符读了 1KB 没读完 (没有返回EAGIN / EWOULDBLOCK), 就继续停留在list中, 反之如果其上的 IO 操作执行完了, 就将其移除list
     

你可能感兴趣的:(linux,知识,epoll)