查漏補缺(十二):select與poll與epoll

這三個都是nio的不同實現

select

它內部維護了一個文件描述符句柄數組,當有io事件發生的時候,它需要把這些文件描述符句柄由用戶空間複製到內核空間,然後由操作系統內核輪詢所有的文件描述符,找到發生了IO事件的那個

缺點:

  • 它需要輪詢所有的文件描述符,在併發量比較高的場景下,這樣的操作很浪費資源和時間
  • 它的文件描述符句柄數組有長度限制,在32的操作系統下是1024,64位下是2048
  • 在發生IO事件的時候,它需要把所有句柄從用戶空間複製到內核空間,再由操作系統內核輪詢。這也是一個重量級操作

poll

poll和select比起來其實沒有太大的轉變。主要就是它是鏈式結構來存儲句柄,並且依然要使用輪詢。只是相比於select,它沒有了長度的限制

epoll

epoll就不再使用輪詢的方式找到對應的IO事件,而是在進行事件註冊的時候,已經把文件描述符複製到內核上了,所以不需要再進行額外的複製,並且如果有IO事件發生,實際上內核會將就緒的文件描述符放到一個就緒隊列中,然後應用程序直接從就緒隊列裏面以O(1)的時間複雜度獲取就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章