选择(select)、epoll、kqueue和evport之间的根本区别是什么?它们在IT技术中的作用是什么?

18

最近我在阅读Redis。 Redis基于I/O多路复用实现了一个简单的事件驱动库。 Redis表示它会选择系统支持的最佳多路复用方法,并给出了以下代码:

/* Include the best multiplexing layer supported by this system.
 * The following should be ordered by performances, descending. */
#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
    #ifdef HAVE_EPOLL
    #include "ae_epoll.c"
    #else
        #ifdef HAVE_KQUEUE
        #include "ae_kqueue.c"
        #else
        #include "ae_select.c"
        #endif
    #endif
#endif

我想知道它们是否有根本的性能差异?如果有,为什么?

最好的问候

1个回答

29

通常来说,所有异步 I/O 子系统都有不同的内部结构,但在当前特定情况下,这些具体的异步 I/O 库被用于支持尽可能多的平台,即:

  • evport = Solaris 10
  • epoll = Linux
  • kqueue = OS X, FreeBSD
  • select = 通常作为备选项安装在所有平台上

EvportEpollKQueue 都具有 O(1) 描述符选择算法复杂度,并且它们都使用内核空间内存结构。此外,它们可以服务于 大量(数十万个)文件描述符。

除了其他库之外,select 只能服务于 最多1024个 描述符,并且需要对所有描述符进行完整扫描,因此其复杂度为O(n)


谢谢。我发现这篇文章很有帮助。http://www.eecs.berkeley.edu/~sangjin/2012/12/21/epoll-vs-kqueue.html - Min Fu
2
需要注意的是,Illumos(开源的Solaris衍生版)也支持(Linux风格的)epoll:https://illumos.org/man/5/epoll - Jasper Siepkes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接