epoll簡介

1.epoll簡介linux

epoll是I/O事件通知工具,與select/poll相比,epoll最大的好處在於它不會隨着監聽fd數目的增加而效率下降。
epoll API既能夠用做edge觸發的接口,也能夠用做level觸發,而且對於監聽大量的文件描述符一樣有很好的性能。編程

由於內核中的select採用輪詢實現的,輪詢的fd數目越多,耗時越多。而且,在linux/posix_types.h中#define __FD_SETSIZE 1024
即select最多同時監聽1024個fd,固然,能夠經過修改頭文件再重編譯內核來擴大這個數目,但這彷佛並不治本。緩存


2.epoll使用方法網絡

(1)使用epoll_create()建立一個epoll實例。
(2)經過epoll_ctl()將想監聽的文件描述符和其事件註冊進epoll實例中。
POLL_CTL_ADD:註冊目標文件描述符,並將事件event與相關聯。
EPOLL_CTL_MOD: 更改與目標文件描述符fd關聯的事件event。
EPOLL_CTL_DEL: 溢出指定的FD併發

可設置的監聽事件類型:
EPOLLIN :表示對應的文件描述符能夠讀(包括對端SOCKET正常關閉);
EPOLLOUT:表示對應的文件描述符能夠寫;
EPOLLPRI:表示對應的文件描述符有緊急的數據可讀(這裏應該表示有帶外數據到來);
EPOLLERR:表示對應的文件描述符發生錯誤;
EPOLLHUP:表示對應的文件描述符被掛斷;
EPOLLET: 將EPOLL設爲邊緣觸發(Edge Triggered)模式,這是相對於水平觸發(Level Triggered)來講的。
EPOLLONESHOT:只監聽一次事件,當監聽完此次事件以後,若是還須要繼續監聽這個socket的話,須要再次把這個socket加入到EPOLL隊列裏socket

(3)經過epoll_wait()來阻塞監聽I/O事件。高併發


3.edge觸發和level觸發的區別工具

epoll事件分發接口可以表現爲邊緣觸發(ET)和水平觸發(LT)。 兩種機制之間的差別能夠描述以下。 假設發生這種狀況:
①表示管道讀取端(rfd)的文件描述符在epoll實例上註冊。
②管道的寫入端在管道的wfd上寫入2kB的數據。
③完成對epoll_wait()的調用,將rfd做爲就緒文件描述符返回。
④管道讀取端先從rfd讀取1kB數據。
⑤完成對epoll_wait()的調用。性能

若是已使用EPOLLET(邊緣觸發)標誌將rfd文件描述符添加到epoll接口,則儘管文件輸入緩衝區中仍存在可用數據,但在步驟⑤中的對
epoll_wait()的調用可能會掛起。緣由是邊緣觸發模式僅在受監視文件描述符發生更改時才傳遞事件。所以在步驟5中對epoll_wait()的調用
可能會無限期地被阻塞。ui

用做水平觸發時(默認是水平觸發的,未指定EPOLLET時),epoll只是一個更快的poll()。


4.注意事項

使用epoll的應用程序應使用非阻塞(O_NONBLOCK)文件描述符(select/poll應該也是同樣的)建議方法以下:
a.使用非阻塞文件描述符;
b.僅在read()或write()以後檢查errno值是不是EAGAIN。(如果非阻塞的讀,讀完了返回-EAGAIN,緩存區寫滿了返回-EAGAIN)


5.EPOLL_CTL_MOD標誌
即便使用邊緣觸發的epoll,也能夠在收到多個事件,調用者能夠選擇指定EPOLLONESHOT標誌,告訴epoll在收到
epoll_wait()事件後禁用關聯的文件描述符。 當指定了EPOLLONESHOT標誌時,若想再次使用epoll來監聽這個描述符調用者
須要使用epoll_ctl(EPOLL_CTL_MOD)從新安裝此文件描述符。

6.epoll的/proc接口
/proc/sys/fs/epoll/max_user_watches 用於限制epoll()監聽的最大文件描述符的個數,用於限制對內核內存的使用。默認是4%的內存佔用。

 

可參考:高併發網絡編程之epoll詳解:https://blog.csdn.net/shenya1314/article/details/73691088epoll 總結:https://blog.csdn.net/xiangguiwang/article/details/80659826

相關文章
相關標籤/搜索