代码之家  ›  专栏  ›  技术社区  ›  Mr. Rogers

epoll_wait事件的epoll顺序

  •  4
  • Mr. Rogers  · 技术社区  · 6 年前

    我从select向epoll移植了一个程序,以增加我们可以处理的套接字数量。我已经在epoll FD中添加了套接字,可以愉快地读写。

    然而,即使我使用的是级别触发事件,我也担心套接字可能会耗尽。我担心的情况是,准备好的插座比准备好的多 epoll_event 结构。我知道下次打电话的时候 epoll_wait 这会给我剩下的人,但我想知道我把他们按什么顺序放在规定的人身上,上一次和这次谁没有被淘汰。

    举个例子: 假设我有10个插座连接并添加到 epoll fd。我的记性只够5分钟 epoll_事件 结构。让我们假设在两次 等等 ,所有10个套接字都接收数据。第一个 等等 将返回5 epoll_事件 用于处理的结构,假设是套接字1-5。我处理这5个套接字,当我这样做时,更多的数据进入,所有10个套接字都有更多的数据要读取。我进入 等等 再来5次 epoll_事件 结构。

    我的问题是,第二次打电话时,我会得到5个插座 等等 .会不会是插座1-5,因为它们被添加到 埃波尔 FD优先?或者我会得到套接字6-10,因为这些事件是在套接字1-5收到更多数据之前引发的?

    本质上是 等等 与FIFO队列类似,或者它只是扫描内部套接字列表(从而优先于列表中的第一个套接字)。

    编辑: 这是Linux内核v4。9.62

    2 回复  |  直到 6 年前
        1
  •  5
  •   mtk    6 年前

    @jxh对该行为的观察是正确的,而且该行为已经存在很长时间了(如果我能正确地回忆起多年前我与实现者Davide Libenzi的电子邮件对话的话,它最初是有意的)。不幸的是,到目前为止还没有记录在案。但是,我已经为即将发布的手册页面修正了这个问题,在哪里 epoll_wait(2) 将载文:

    如果超过 maxevents 文件描述符在 epoll_wait() 被称为,然后是连续的 epoll_wait() 电话会 循环使用一组现成的文件描述符。这 行为有助于避免流程失败的饥饿场景 注意,其他文件描述符已经准备好,因为 重点介绍一组已知的文件描述符 准备好的

        2
  •  4
  •   jxh    6 年前

    仔细阅读源文件 epoll ,可以看到就绪事件被保存在一个链接列表中。事件将从列表的开头删除,并添加到列表的末尾。

    基于此,答案是描述符顺序基于它们准备就绪的顺序。