2014-10-17 2226 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

相關問題