电平触发epoll
与十分相似poll
。为什么不poll
只是epoll
支持后者的系统的包装?
编辑:我的意思是,对于这种决定是否存在任何技术障碍?实施poll
as epoll
将大大提高许多网络应用程序的性能。应该有一些我没有注意到的技术问题。
poll
为包装程序epoll
将非常复杂且效率低下。您要么必须设置一个新的epoll描述符并每次对其进行配置,要么必须对当前轮询集与已经与epoll描述符关联的轮询集进行比较。!
电平触发epoll
与十分相似poll
。为什么不poll
只是epoll
支持后者的系统的包装?
编辑:我的意思是,对于这种决定是否存在任何技术障碍?实施poll
as epoll
将大大提高许多网络应用程序的性能。应该有一些我没有注意到的技术问题。
poll
为包装程序epoll
将非常复杂且效率低下。您要么必须设置一个新的epoll描述符并每次对其进行配置,要么必须对当前轮询集与已经与epoll描述符关联的轮询集进行比较。!
Answers:
在容易的情况下,民意测验要简单得多。对于少量的文件描述符,它可能同样有效。呼叫者不必担心维护轮询FD和添加/删除FD,他们只需在每次轮询中添加他们想要的所有FD。
我的感觉是它们是互补的,尽管民意调查可以作为epoll的包装器实施,但实际上不应该如此。
epoll可以(几乎)被实现为民意测验的包装器,但这将打败其效率论点。
的语义poll()
和epoll
是不同的。如果poll()
通知您描述符是可读的,则您需要进行一些读取但不读取所有可用的字节,然后poll()
再次将该描述符传递给它,它将立即唤醒。AFAIK并非如此epoll
。
另请注意,epoll
描述符是有限的资源。 手册页讨论了epoll_create()
AFAIK不会出现的故障情况poll()
。
尽管我不确定所有的实现细节,但是由此我们可以说为进行poll()
包装没有任何意义epoll
。程序员必须意识到这些要点,并且在假设poll()
允许的情况下编写的现有代码会中断。
好的,七年后,根据Evan Klitzke的这篇文章,我得到了一个更有说服力的答案。
首先,我首先问这个问题的原因是epoll
与poll
/ 相比经常提到的性能优势select
。这个单词go epoll
渐近地比poll
(O(N))更有效(O(1 ))。
尚未广为人知的是,只有边沿触发 epoll
才是真正的O(1),而电平 触发则epoll
具有相同的O(N)渐近性。确实,每次被调用以查找可能还有更多数据待处理的fds时,级别触发的味道就必须遍历受监视fds的列表。边缘触发的变化可以依靠信号来响应fd中出现的新字节。
找出恢复的线程如何确切地找出哪个fd唤醒了它会很有趣,但是在epoll触发的唤醒过程中肯定会传递此数据。
显然,poll
/ select
不能使用边缘触发, epoll
因为语义是不同的。正如我们所看到的那样,使用级别触发的 实现epoll
不会带来渐进的性能优势。而且,如果恒定因素或恒定条件较高,可能也会对其产生负面影响(因为它们似乎基于我所做的粗略基准,并在另一条评论中引用了该基准)。
有关更多信息,请阅读阻止I / O,非阻止I / O和Epoll。