select poll和epoll之間的區別

2022-07-07 03:48:11 字數 1495 閱讀 9920

在深入理解select、poll和epoll之間的區別之前,首先要了解什麼是io多路復用模型。

簡單來說,io多路復用是指核心一旦發現程序指定的乙個或者多個io條件準備就緒,它就通知該程序去進行io操作。

詳細的描述可以參考io模型。select、poll和epoll都是提供i/o多路復用的解決方案。

int select(int maxfdp, fd_set *readset, fd_set *writeset, 

fd_set *exceptset, struct timeval *timeout);

int poll ( struct pollfd * fds, unsigned int nfds, int timeout);
// 建立乙個epoll物件,引數size是核心保證能夠正確處理的最大控制代碼數

int epoll_create(int size);

// 操作上面建立的epoll

// 例如,將剛建立的socket加入到epoll中讓其監控,或者

// 把 epoll正在監控的某個socket句並移出epoll

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

// 在指定的timeout時間內,當所有控制代碼中有事件發生時,就返回給使用者態的程序

epoll的兩種工作方式

et模式的效率比lt模式的效率要高很多。只是如果使用et模式,就要保證每次進行資料處理時,要將其處理完,不能造成資料丟失,這樣對編寫**的人要求就比較高。 為了保證資料的完整性,et模式只支援非阻塞的讀寫。

實現機制

時間複雜度

連線數傳遞方式

select

o(n)

1024

核心-->使用者

poll

o(n)

無限制核心-->使用者

epoll

o(1)

很大共享記憶體

在select和poll中,程序只有在呼叫方法後,核心才對所有監視的檔案描述符進行掃瞄,發現有任何乙個檔案描述符就緒或者超時就立刻返回。epoll採用基於事件的就緒通知方式,事先通過epoll_ctl()來註冊乙個檔案描述符,一旦基於某個檔案描述符就緒時,核心會採用類似callback的**機制,迅速啟用這個檔案描述符,當程序呼叫epoll_wait()時便得到通知。

select, poll和epoll的區別

我只用過select select 最不能忍受的是乙個程序所開啟的fd是有一定限制的,由fd setsize設定,預設值是2048。對於那些需要支援的上萬連線數目的im伺服器來說顯然太少了,select要掃瞄各個檔案描述符,而epool採用mmap更高效 select 系統呼叫提供乙個機制來實現同步...

select poll和epoll的區別

select,poll,epoll都是io多路復用的機制。i o多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒 一般是讀就緒或者寫就緒 能夠通知程式進行相應的讀寫操作。select僅僅知道i o事件發生的檔案描述符的數量,但並不知道是哪幾個 1 時間複雜度 o n 2 優點 跨平台支...

select,poll和epoll的API複習筆記

環境 centos7 xshell 前言 select poll epoll 的區別一定要清楚 select 優點是跨平台,而poll相對其沒有1024檔案描述符的限制,共有的缺點是 1.每次監聽都需要將監聽的資訊從應用層拷貝到核心。2.返回變化的檔案描述符的個數,具體哪個檔案描述符變化需要遍歷。3...