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

在Linux的epoll事件驱动编程中,边缘触发(ET)模式可能导致文件描述符饥饿现象,即一个高流量的文件描述符占用过多处理时间,导致其他文件描述符得不到及时响应。为了解决这个问题,可以采取应用层维护就绪文件描述符列表的策略,限制每次对每个文件描述符的IO操作,例如每次读取1KB,确保所有文件描述符都有机会被处理。当文件描述符未读完时,将其保留在列表中,待后续处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景(饥饿问题)


        使用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
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值