概念理解
selector與epoll是多路復用的函數。我認為多路復用是針對bio而言,指的是通過單線程來追蹤管理多個socket對象。傳統的bio中,在socket的accept與read兩個階段都會造成阻塞,那么就無法處理並發問題,即僅一個socket對象就已經占用了IO對象,沒有余力解決其他線程的請求。那么如何讓bio能夠處理並發問題呢?就是在accept和read階段不再阻塞,當accept到socket對象的時候就將其緩存至list中,同時如果read到數據了就處理數據。但如果沒有accept對象,則會去list中詢問以前accept的對象有沒有需要read的數據。如此,通過一個線程完成了多個socket對象的管理。那么selector與epoll就是完成了上述功能。
對比分析
selector內部維持了一個數據結構(bitmap),用來存儲已經接受的socket對象。然后將此數據復制一份,交給內核去輪訓每個socket對象是否有期待的事件發生,如果有就會進行置位(用戶態到內核態的復制)。然后返回給用戶態,由用戶態完成事件的處理。
epoll針對selector進行了優化,采用紅黑樹來存儲accept的socket對象,同時還維持着一個list,存放有發生的事件的socket以及事件,然后將此任務隊列返回。用戶態無需遍歷所有的socket對象。下圖即為epoll的說明圖。

