select 和 epoll 的區別總結
阿新 • • 發佈:2018-11-10
在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就通知有事件發生。
由於筆者的水平有限,出錯在所難免,懇請讀者拍磚指正,謝謝閱讀 。