作業系統系列 IO 多路復用 epoll 詳解

2021-10-17 03:32:56 字數 2407 閱讀 5132

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_createepoll_ctlepoll_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 ...