做以簡單區分為面試作答提供一些幫助:
select 和 epoll都為一種網路i/o模型,都是採用了檢測了控制代碼集合中的資料,來實現多路復用。
select檔案控制代碼檢測數有限,核心中_fd_setsize定義為2048超出範圍將無法檢測,在掃瞄上select
採用的是輪詢的方式當檢測的量太大時會造成輪詢不過來引起的超時。為了克服select的缺陷
linux引入了epoll其特點是控制代碼集合量沒有限制,可以比select大的多,epoll只檢測活躍的控制代碼,這樣可以避免
不必要的太長時間的輪詢。epoll中還使用了mmap來提高記憶體複製的數度只需要把訊息傳入核心一次就好,select
卻要每次都複製。
主要函式為:create_epoll(int maxfd);建立乙個epoll控制代碼 其中maxfd是支援的最大控制代碼數。
epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);第乙個引數是epoll_create()的返回值,
建立epoll的專用檔案描述符,相當於fd_set 和 fd_clr
第二個引數表示動作,用三個巨集來表示
epoll_ctl_add:註冊新的fd到epfd;
epoll_ctl_mod:修改已經註冊的fd的監聽事件
epoll_ctl_del:從epfd中刪除乙個fd
第三個引數是要監聽的fd
第四個引數是要告訴核心要監聽什麼事件,struct epoll_event結構如下:
struct epoll_event{
_uint32 events;
epoll_data_t data;
events:可以一下幾個巨集集合:
epollin: 表示對應檔案描述符可寫
epollout: 表示對應的檔案描述符可寫
epollpri: 表示對應的檔案描述符有緊急的資料可讀(這裡應該表示有帶外資料到來);
epollerr: 表示對應的檔案描述符發生錯誤;
epollhup: 表示對應的檔案描述符被結束通話;
epollet: 將
epoll設為邊緣觸發
(edgetriggered)模式,這是相對於水平觸發
(leveltriggered)來說的。
epolloneshot:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個
int epoll_wait(int epfd, struct epoll_event*events, int maxevents, int timeout);這個函式返回的資料是發生的事件數
等待i/o 事件的發生;引數說明:
epfd: 由
epoll_create() 生成的
epoll 專用的檔案描述符;
epoll_event:用於回傳代處理事件的陣列;
maxevents:每次能處理的事件數;
timeout: 等待
i/o 事件發生的超時值;
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 ...
Select和epoll的區別
當乙個節點和多個節點建立連線時,如何高效的處理多個連線的資料,下面具體分析兩者的區別。1.select函式 函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout ...