unix網路程式設計 I O多路復用之epoll

2022-09-01 09:54:14 字數 2449 閱讀 8707

當程式進行io時,如果資料尚未準備好,那麼io將處於阻塞狀態。當某個程序有多個開啟的檔案,比如socket,那麼其後的所有準備好讀寫的檔案將受到阻塞的影響而不能操作。不借助執行緒,單一程序無法在同一時間服務多個檔案描述符。非阻擋式io可以作為乙個解決方案,但是效率並不高。首先程序需要不斷發io請求,其次,如果程式可以休眠,讓出cpu將提高效率。多工式io是在其中任何乙個檔案描述符就緒時收到通知,此時io將不會受到阻擋,其餘時間處於休眠狀態,將cpu資源讓給別的程序。

為了實現i/o多路復用,epoll是在2.6核心中提出的,是之前的select和poll的增強版本。相對於select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用乙個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的乙個事件表中,這樣在使用者空間和核心空間的copy只需一次。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。

#include int epoll_create(int size);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

建立乙個epoll的控制代碼,size用來告訴核心這個監聽的數目一共有多大。這個引數不同於select()中的第乙個引數,給出最大監聽的fd+1的值。需要注意的是,當建立好epoll控制代碼後,它就是會占用乙個fd值,在linux下如果檢視/proc/程序id/fd/,是能夠看到這個fd的,所以在使用完epoll後,必須呼叫close()關閉,否則可能導致fd被耗盡。

epoll的事件註冊函式,對比select()函式,select()是在監聽事件時告訴核心要監聽什麼型別的事件,而epoll是在呼叫epoll_ctl函式的時候,先註冊要監聽的事件型別。

epfd:epoll_create()的返回值;

op:表示要進行的操作,操作的動作使用了巨集定義:

epoll_ctl_add: 註冊新的fd到epfd中;

epoll_ctl_mod: 修改已經註冊的fd的監聽事件;

epoll_ctl_del: 刪除epfd中的乙個fd;

fd:關聯的檔案描述符,表示需要監聽的fd;

event:指向epoll_event的指標,告訴核心需要監聽什麼事件,epoll_event的結構如下:

struct epoll_event ;

events描述事件型別,使用了巨集定義:

1. epollin:表示對應的檔案描述符可以讀(包括對端socket正常關閉);

2. epollout: 表示對應的檔案描述符可以寫;

3. epollpri: 表示對應的檔案描述符有緊急的資料可讀(表示有外資料到來);

4. epollhup: 表示對應的檔案描述符被結束通話;

5. epollet: 將epoll設定為邊緣觸發(edge triggered)模式;

6. epolloneshot: 只監聽一次事件,當監聽玩這次事件之後,如果還需要繼續監聽,需要再次將該socket加入epoll佇列中。

等待事件的產生,類似於select()呼叫。引數events用來從核心得到事件的集合,maxevents告之核心這個events有多大,這個maxevents的值不能大於建立epoll_create()時的size,引數timeout是超時時間(毫秒,0會立即返回,-1表示不確定)。該函式返回需要處理的事件數目,如返回0表示已超時。

epoll對檔案描述符的操作有兩種模式:lt(level trigger,水平觸發)和et(edge trigger,邊緣觸發)。

lt模式:水平觸發是預設的工作方式。當epoll_wait檢測到描述符事件發生並將此事件通知應用程式,應用程式可以不立即處理該事件(進行io操作)。下次呼叫epoll_wait時,會再次響應應用程式並通知此事件。由於對於描述事件符在處理前會進行多次通知,因此出錯的概率小;

et模式:當epoll_wait檢測到描述符事件發生並將此事件通知應用程式,此時它會假設你知道檔案描述符已就緒,應用程式必須立即處理該事件。如果不處理,下次呼叫epoll_wait時,不會再次響應應用程式並通知此事件,直到做了一定操作導致該檔案描述符再次變為未就緒狀態。但是如果一直對該fd進行io操作()

et模式在很大程度上減少了epoll事件被重複觸發的次數,因此效率要比lt模式高。epoll工作在et模式的時候,必須使用非阻塞套介面,以避免由於乙個檔案控制代碼的阻塞讀/阻塞寫操作把處理多個檔案描述符的任務餓死。

UNIX網路程式設計 I O多路復用

目錄 unix下可用的5種i o模型 阻塞式i o模型 非阻塞式i o模型 i o復用模型 訊號驅動式i o模型 非同步i o模型 各種i o模型的比較 參考 阻塞式i o 非阻塞式i o i o復用 訊號驅動式i o sigio 非同步i o poxis的aio 系列函式 比如乙個輸入操作通常包含...

《網路程式設計》I O 多路復用

在前面的文章中介紹了五種 i o 模型 i o 模型 這裡介紹 i o 模型中 i o 多路復用在 tcp 套接字程式設計中的使用。在 i o 多路復用中主要是 select 和 poll 函式的使用。該函式允許程序指示核心等待多個事件中的任何乙個發生,並只在乙個或多個事件發生或超過指定時間後才被喚...

I O多路復用之poll

poll的優點 1 poll 不要求開發者計算最大檔案描述符加一的大小。2 poll 在應付大數目的檔案描述符的時候速度更快,相比於select。3 它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。poll的缺點 1 大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是...