epoll_wait中事件的epoll顺序
收藏

我已经将一个程序从select移植到epoll,以增加我们可以处理的套接字的数量。我已经将套接字添加到epoll fd中,并且可以愉快地读写。
然而,尽管我使用的是级别触发事件,但我仍然担心套接字可能会出现饥饿。我担心的情况是,准备好的套接字比epoll_event结构多。我知道下一次我打电话给epoll_wait它会给我剩下的,但是我想知道我是怎么让他们和那些上次没有和这次做对比的人一起加入的。
例如:
假设我连接了10个插座并添加到epollfd。我只有5个结构的足够记忆。假设在每个epoll_event之间的时间内,所有10个套接字都接收数据。第一个epoll_wait将返回5个epoll_wait结构进行处理,假设它是套接字1-5。我处理这5个套接字,当我这样做时,更多的数据进入,所有10个套接字都有更多的数据要读取。我再次输入epoll_event并得到5个epoll_wait结构。
我的问题是,第二次调用epoll_event时,我将得到哪5个套接字。是否会是插座1-5,因为它们是先添加到epoll_waitfd的?或者我会得到套接字6-10,因为这些事件是在套接字1-5上的更多数据进入之前引发的?
本质上,isepoll就像fifo队列,或者它只是扫描套接字的内部列表(从而支持列表中的第一个套接字)。
编辑:
这是Linux内核v4.9.62


最佳答案:

@jxh对该行为的观察是正确的,而且该行为是长期确立的(如果我正确地回忆起多年前与实现者davide libenzi的电子邮件对话,那么最初的目的就是这样)。很不幸,到目前为止还没有记录在案。但是,我已经修复了即将发布的手册页面,其中epoll_wait(2)将包含以下文本:
如果在
调用epoll_wait(),然后连续调用
循环遍历一组就绪的文件描述符。这个
行为有助于避免流程失败的饥饿场景
注意到额外的文件描述符已经准备好了,因为
关注一组已知的文件描述符
准备好了。

    公众号
    关注公众号订阅更多技术干货!