【发布时间】:2018-10-28 06:44:45
【问题描述】:
我已经将一个程序从 select 移植到 epoll 以增加我们可以处理的套接字数量。我已经将sockets添加到epoll FD中,可以愉快地读写了。
但是,即使我正在使用关卡触发事件,我也担心可能会出现套接字不足的情况。我担心的情况是当准备好的套接字比epoll_event 结构更多时。我知道下次我打电话给epoll_wait 时,它会给我剩下的,但我想知道我让他们按什么顺序排列,并提醒上次和这次谁没有晋级。
一个例子:
假设我有 10 个套接字连接并添加到 epoll fd。我只有 5 个epoll_event 结构的足够内存。假设在每个epoll_wait 之间的时间里,所有10 个套接字都接收到数据。第一个 epoll_wait 将返回 5 个 epoll_event 结构进行处理,假设它是套接字 1-5。我处理了这 5 个套接字,当我这样做的时候,更多的数据进来了,所有 10 个套接字都有更多的数据要读取。我再次输入epoll_wait 并获得另外5 个epoll_event 结构。
我的问题是,在第二次调用 epoll_wait 时,我将获得哪些 5 个套接字。会不会是套接字 1-5,因为它们首先被添加到 epoll FD 中?或者我会得到套接字 6-10,因为这些事件是在更多数据进入套接字 1-5 之前引发的?
本质上,epoll_wait 是像 FIFO 队列,还是只是简单地扫描套接字的内部列表(从而优先考虑列表中的第一个套接字)。
编辑: 这是Linux内核v4.9.62
【问题讨论】:
-
这是 Linux 吗? stackoverflow.com/a/19114553/315052
-
@jxh epoll 函数是 Linux 特定的。
-
@Someprogrammerdude:其他 Unices 将实现包装 API 以实现兼容性。例如:FreeBSD's Linux binary compatibility feature;甚至 Windows 也有 wepoll
-
文档在这一点上不清楚。人们希望内核 queues epoll 事件,以便假定的第二个
epoll_wait()检索文件描述符 6-10 上的事件,但看起来我必须研究内核源才能确定(并且由于它没有记录,它可能会改变)。 -
@jxh 我阅读了您对链接解决方案的回答。如果事件确实保存在链表中,那么 epoll 将像 FIFO 一样工作,我的饥饿问题毕竟不是问题。但是,由于这是对未定义行为的依赖,因此我将保留它以供其他输入,以防它在过去 5 年内发生变化。