1. 程式人生 > >select 和 epoll 的區別總結

select 和 epoll 的區別總結

在Linux中,select 和epoll函式,都是為了監控大量的描述符,是一種I/O多路複用技術。下面總結它們的區別:

select 與 epoll區別

1、開啟的最大描述符數量限制
   select 檔案描述符使用的是linux ext3,因此開啟數量受限制,一般預設為1024
   epoll自己實現了一個虛擬檔案系統,因此開啟的描述符數就和機器記憶體有關,這個數值會很大

2、描述符傳遞方式
  a、 select 每次呼叫時,都要傳入描述符集,都要從使用者空間拷貝核心空間,不僅如此,還會把傳入的fd_set描述符                    集清空,還必須對重新把每個描述符加入到fd_set中。
         epoll 只需第一次傳入,核心會儲存描述符集,是儲存在核心空間和使用者空間共同mmap的一塊空間,這樣省去                    由使用者空間拷貝到核心空間的過程,並且epoll_ctl 可以對描述符增、刪、改。
  b、 select 返回的只是就緒描述符的個數,必須遍歷描述符集找到就緒的描述符,顯然描述符過多,成為效率瓶頸。
         epoll  把就緒描述符儲存在傳出引數 epoll_event陣列中
   
3、內部輪詢機制

   select 每次呼叫都要遍歷所有的描述符來發現描述符是否就緒,因此隨著描述符數量增加,效率直線下降
   epoll  只是判斷連結串列rdlist是否為空即可,因為每次新增描述符時,會註冊一個回撥函式,使該事件與相應的網絡卡設               備驅動程式建立回撥關係,當描述符就緒時,就會呼叫回撥函式,把這個描述符新增到rdlist,rdlist 就是一個               就緒描述符的連結串列。 

4、事件觸發模式

   select 只支援水平觸發

   epoll   支援兩種觸發模式ET(邊角觸發)和LT(水平觸發),這其實和電路中高電平觸發和邊沿觸發的模式是一樣              的,ET模式是指描述符由不可讀或者不可寫變為可讀或者可寫時,epoll才通知有事件發生LT模式則是描述符             只要可讀或者可寫,epoll就通知有事件發生。

由於筆者的水平有限,出錯在所難免,懇請讀者拍磚指正,謝謝閱讀