epoll_create
int
epoll_create
(int size)
;
當建立好 epoll 控制代碼後,它會占用乙個 fd 值,在 linux 下檢視/proc/程序id/fd/
,就能夠看到這個 fd。
epoll_ctl
/**
* epfd 即 epoll_create 返回的檔案描述符,指向乙個 epoll 例項
* fd 表示要監聽的目標檔案描述
* * event 表示要監聽的事件(可讀、可寫、傳送錯誤…)
* struct epoll_event ;
* * op 表示要對 fd 執行的操作,有以下幾種:
* epoll_ctl_add:為 fd 新增乙個監聽事件 event
* epoll_ctl_mod:改變 fd 的監聽事件
* epoll_ctl_del:刪除 fd 的所有監聽事件,這種情況下 event 引數沒用
*/int
epoll_ctl
(int epfd,
int op,
int fd,
struct epoll_event *event)
;
epoll_wait
/**
* epfd 即 epoll_create 返回的檔案描述符,指向核心中乙個 epoll 例項
* events 是乙個陣列,儲存就緒狀態的檔案描述符,其空間由呼叫者負責申請
* maxevents 指定 events 的大小
* timeout 類似於 select 中的 timeout。
* 如果沒有檔案描述符就緒,即就緒隊列為空,則 epoll_wait 會阻塞 timeout 毫秒。
* 如果 timeout 設為 -1,則 epoll_wait 會一直阻塞,直到有檔案描述符就緒;
* 如果 timeout 設為 0,則 epoll_wait 會立即返回
*/int
epoll_wait
(int epfd,
struct epoll_event *events,
int maxevents,
int timeout)
;
epoll 模型使用三個函式:epoll_create
、epoll_ctl
和epoll_wait
。
epoll_ctl
同時,對於就緒的 fd集合返回的拷貝問題,epoll 通過核心與使用者空間mmap(記憶體對映)同一塊記憶體來解決。
epoll 在核心中組織 fd 的結構
epoll引入了乙個中間層
為了做到只遍歷就緒的fd,需要有個地方來組織那些已經就緒的fd
還有與select或poll不同的是,epoll的process不需要同時插入到多路復用的socket集合的所有睡眠佇列中
同時,引入乙個中間的wait_entry_sk,睡眠在真正的 socket 睡眠佇列上,它與某個socket sk密切相關
1、epoll_ctl (示例新增事件 epoll_ctl_add)邏輯
2、epoll_wait 邏輯
epoll 整個喚醒邏輯如下(對於可讀事件而言):
epoll 巧妙的引入乙個中間層解決了大量監控socket的無效遍歷問題。
同時,epoll引入了乙個睡眠佇列single_epoll_wait_list,分割了兩類睡眠等待。
et vs lt - 概念
level triggered (lt) 水平觸發
兩種模式的本質:
對於level triggered (lt) 水平觸發(如果原先 ready list 中的某個 sk 關心的事件相同,重新加入):
即: et vs lt - 效能
在服務端有海量活躍socket的時候,lt模式下,epoll_wait返回的時候,會有海量的socket sk重新放入ready_list。
但事實是目前還沒有實際應用場合的測試表面et比lt效能更好。
et vs lt - 對於 socket 是否阻塞的要求
et強制需要在 socket 的非阻塞模式下使用
由於在阻塞模式下,無法通過recv/read來探測空資料事件,所以必須採用非阻塞模式,一直read直到eagain。
et 模式下死鎖和socket餓死現象
et 模式下在epoll_wait返回socket_fd可讀的時候,要小心處理,要不然會造成死鎖和socket餓死現象。
et vs lt - 總結
et - 對於寫操作 lt
IO多路復用 select poll和epoll
select include int select int maxfdp1,fd set restrict readfds,fd set restrict writefds,fd set restrict exceptfds,struct timeval restrict tvptr 引數描述 se...
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
i o多路復用
最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...