IO多路轉接 epoll高階

2021-10-10 03:05:46 字數 2539 閱讀 9347

例項三:基於網路c/s非阻塞模型的epoll et觸發模式

epoll事件有兩種模型:

et模式即edge triggered工作模式。

如果我們在第1步將rfd新增到epoll描述符的時候使用了epollet標誌,那麼在第5步調用epoll_wait之後將有可能會掛起,因為剩餘的資料還存在於檔案的輸入緩衝區內,而且資料發出端還在等待乙個針對已經發出資料的反饋資訊。

只有在監視的檔案控制代碼上發生了某個事件的時候 et 工作模式才會匯報事件。因此在第5步的時候,呼叫者可能會放棄等待仍在存在於檔案輸入緩衝區內的剩餘資料。

epoll工作在et模式的時候,必須使用非阻塞套介面,以避免由於乙個檔案控制代碼的阻塞讀/阻塞寫操作把處理多個檔案描述符的任務餓死。最好以下面的方式呼叫et模式的epoll介面,在後面會介紹避免可能的缺陷。

基於非阻塞檔案控制代碼

只有當read或者write返回eagain(非阻塞讀,暫時無資料)時才需要掛起、等待。但這並不是說每次read時都需要迴圈讀,直到讀到產生乙個eagain才認為此次事件處理完成,當read返回的讀到的資料長度小於請求的資料長度時,就可以確定此時緩衝中已沒有資料了,也就可以認為此事讀事件已處理完成。

lt模式即level triggered工作模式。

與et模式不同的是,以lt方式呼叫epoll介面的時候,它就相當於乙個速度比較快的poll,無論後面的資料是否被使用。

lt(level triggered):lt是預設的工作方式,並且同時支援block和no-block socket。在這種做法中,核心告訴你乙個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行io操作。如果你不作任何操作,核心還是會繼續通知你的,所以,這種模式程式設計出錯誤可能性要小一點。傳統的select/poll都是這種模型的代表。

et(edge-triggered):et是高速工作方式,只支援no-block socket。在這種模式下,當描述符從未就緒變為就緒時,核心通過epoll告訴你。然後它會假設你知道檔案描述符已經就緒,並且不會再為那個檔案描述符傳送更多的就緒通知。請注意,如果一直不對這個fd作io操作(從而導致它再次變成未就緒),核心不會傳送更多的通知(only once).

#include

#include

#include

#include

#include

#define maxline 10

intmain

(int argc,

char

*ar**)

close

(pfd[1]

);}else

if(pid >0)

}close

(pfd[0]

);close

(efd);}

else

return0;

}

/* server.c */

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxline 10

#define serv_port 8080

intmain

(void)}

return0;

}

/* client.c */

#include

#include

#include

#include

#define maxline 10

#define serv_port 8080

intmain

(int argc,

char

*ar**)

close

(sockfd)

;return0;

}

/* server.c */

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxline 10

#define serv_port 8080

intmain

(void)}

return0;

}

/* client.c */

#include

#include

#include

#include

#define maxline 10

#define serv_port 8080

intmain

(int argc,

char

*ar**)

close

(sockfd)

;return0;

}

多路I O轉接之epoll模型

epoll是linux下多路復用io介面select poll的增強版本,它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率,因為它會復用檔案描述符集合來傳遞結 果而不用迫使開發者每次等待事件之前都必須重新準備要被偵聽的檔案描述符集合,另一點原因就是獲取事件的時候,它無須遍歷整個...

Linux下I O多路轉接之epoll

linux下i o多路轉接之epoll epoll i o event notification facility 在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不...

I O多路轉接 epoll伺服器

在前面的兩篇部落格中,我們介紹了最早期的select和改進版的poll 但是,他兩都沒有改進的就是,想要快速知道事件就緒並沒有得到改進,兩個全部是遍歷陣列,我們都知道它的時間複雜度就是o n 效率不是很高,時間複雜度達到o 1 才是高效的 epoll是linux特有的i o復用函式,它在實現和使用上...