12

我最近在读 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

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

此致

4

1 回答 1

23

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

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

Evport, Epoll, 并且KQueue具有O(1)描述符选择算法复杂度,并且它们都使用内部内核空间内存结构。他们还可以提供大量(数十万)文件描述符。

除其他外,select最多只能提供1024个描述符,并对描述符进行全扫描(因此每次迭代所有描述符以选择一个使用),因此复杂度为O(n)

于 2014-10-17T15:22:21.353 回答