epoll和select的分析

2021-06-25 16:16:13 字數 1213 閱讀 2552

昨天關於epoll和select的問題被阿里的面試官狂虐,今天好好準備下吧。。。兩個函式都是i/o多路復用

select 函式

int select(int maxfd,fd_set* read,fd_set* write,fd_set* exception,struct timeval* timeout);

第乙個引數是傳遞給核心的最大的描述符+1,

引數read,write,exception,是觀察這些描述符上是否有讀、寫、異常等,

timeout有三種方式 1)timeout == null時,永遠等待下去,直到有乙個描述符準備好  2)timeout->sec != 0 || timeout->usec != 0 有乙個描述符準備好就返回,但不超過給定

的時間3)timeout->sec == 0 || timeout->usec == 0,根本不等待,立即返回.

函式返回準備好的描述符的個數

epoll 函式

int  epoll_create(int size) 返回乙個要控制代碼,size是告訴核心大致要處理的事件的數目

int  epoll_ctl(int epfd,int op,int fd,struct epoll_event* event)  epfd是epoll_create返回的控制代碼,op是操作(三種,新增事件,修改事件,刪除事件),fd是監聽的連線套接字,event

是在告訴epoll對什麼樣的事件感興趣

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

收集在epoll監控的事件中發生的事件,epoll會把發生的事件複製到events陣列中,maxevents是events陣列的大小,timeout表示沒有檢測到時事件發生時最多等待的時間,如果是0的話,會立即返回

兩種觸發方式:水平觸發和垂直觸發,當乙個事件發生時,通過epoll_wait可以獲取到該事件,但是當該事件對應的套接字緩衝區未處理完時,設定為邊緣觸發時,通過epoll_wait 不能獲取到該事件,通過水平觸發的方式可以.

三點不同:

1)select對檔案描述符的個數有限制,epoll對事件發生的個數沒有限制

2)select採用輪詢的方式檢查每個描述符是否是活躍的,epoll_wait獲得的事件都是活躍的

3)epoll採用的是記憶體對映的技術,加速了核心態和使用者態之間的訊息傳遞

參考: 



Select和epoll的區別

當乙個節點和多個節點建立連線時,如何高效的處理多個連線的資料,下面具體分析兩者的區別。1.select函式 函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout ...

Select和epoll的區別

當乙個節點和多個節點建立連線時,如何高效的處理多個連線的資料,下面具體分析兩者的區別。1.select函式 函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout ...

epoll和select的區別

做以簡單區分為面試作答提供一些幫助 select 和 epoll都為一種網路i o模型,都是採用了檢測了控制代碼集合中的資料,來實現多路復用。select檔案控制代碼檢測數有限,核心中 fd setsize定義為2048超出範圍將無法檢測,在掃瞄上select 採用的是輪詢的方式當檢測的量太大時會造...