Linux中高級IO多路轉接中select、poll和epoll的優缺點,這裏主要談select和poll的缺點以及epoll的優勢。緩存
1、select的缺點:數據結構
一、編寫難度大性能
二、同時處理的文件描述符是有上限的操作系統
三、每次須要從新設定fd集合隊列
四、性能會隨用戶的增多而效率下降事件
五、輸入輸出參數在一塊兒內存
2、poll的缺點it
poll是對select的一種改良,最突出的改良有兩點:效率
一、文件描述符數量沒有上限監控
二、將輸入輸出參數進行分離,不用每次設定
那麼poll的缺點是:
poll中監聽的文件描述符數目增多時:
一、和select同樣,poll返回後,須要輪詢pollfd來獲取就緒的描述符
二、每次調用poll都須要大把大量客戶端在一時刻可能只有不多的處於就緒狀態,所以隨着監視的描述符數量的增加,其效率也會線性降低。
3、epoll的優勢:
一、文件描述符數目沒有上限:經過epoll_ctl()來註冊一個文件描述符,內核中使用紅黑樹的數據結構來管理全部須要監控的文件描述符。
二、基於事件就緒通知方式:一旦被監聽的某個文件描述符就緒,內核會採用相似於callback的回調機制,迅速激活這個文件描述符,這樣隨着文件描述符數量的增長,也不會影響斷定就緒的性能。
三、維護就緒隊列:當文件描述符就緒,就會被放到內核中的一個就緒隊列中,這樣調用epoll_weit獲取就緒文件描述符的時候,只要取隊列中的元素便可,操做的時間複雜度恆爲O(1)。
四、關於有些地方說:epoll還有內存映射機制,即內核將就緒隊列經過mmap的方式映射到用戶態,避免了拷貝內存這樣的額外性能開銷。關於這一點,我並不認爲這是epoll的優勢,由於他和epoll底層工做方式相悖。mmap是一種共享內存,可是咱們都知道共享內存中一旦有數據,用戶就能直接看到,而且使用,可是epoll_wait在取數據時傳入了一塊緩存區這是和貢獻內存相悖的其一;其二是操做系統並不相信任何人,尤爲是用戶,它不會讓用戶直接去取內核中的數據。