2014-10-17 2225 views
3

我最近在读Redis。 Redis基于I/O多路复用实现了一个简单的事件驱动库。 Redis的说,它会选择系统所支持的最佳复用,并给出了下面的代码:select,epoll,kqueue和evport之间的根本区别是什么?

/* 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 

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

问候

回答

5

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

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

EvportEpollKQueueO(1)描述符选择算法的复杂性,它们都使用内部内核空间内存结构。他们也可以服务(数十万)文件描述符。

除了别人,select只能服务高达1024个描述符,并执行(所以它遍历所有描述符,以选择一个与上工时间)描述的全扫描,所以复杂度为为O(n)

+0

谢谢。我发现这篇文章有帮助。 http://www.eecs.berkeley.edu/~sangjin/2012/12/21/epoll-vs-kqueue.html – 2014-10-19 01:28:38

相关问题