epoll與selector的簡單理解

2022-05-04 17:45:18 字數 741 閱讀 2426

概念理解

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的說明圖。

epoll與select的區別

epoll跟select都能提供多路i o復用的解決方案。在現在的linux核心裡有都能夠支援,其中epoll是linux所特有,而select則應該是posix所規定,一般作業系統均有實現。網上現在關於這兩者不同的介紹已經到處都是了。我這裡也不能多說出什麼東西,只是記錄下我看了實現 之後的一些總結...

poll, select與epoll的用法

多路io復用 就是實現同時監控多個檔案描述符 此類檔案描述符必須為不可操作時會進入堵塞狀態 會堵塞直到有乙個或多個檔案描述符可操作為止,通過返回值找出可操作的檔案描術符 可代替多執行緒工作 linux下共有三個函式可完成此工作 一.poll函式 include int poll struct pol...

Swift Swift中Selector的變化

swift中selector變化 2.2 之前,使用字串作為方法名稱 無引數btn.addtarget self,action selector buttonpress forcontrolevents touchupinside 有引數 btn.addtarget self,action sele...