浅析epoll-为何多路复用I/O要使用epoll
本文轉自C++愛好者博客?http://www.cppfans.org/author/eliteyang,順便記錄一下自己學習epoll的過程。
現如今,網絡通訊中用epoll(linux)和IOCP(windows)幾乎是大家津津樂道的東西,不為別的,就因為高效,所以大家喜歡用。IOCP的基礎東西已經講過了,可翻閱《IOCP淺析》?《IOCP淺析[二]——IOCP出現的意義和函數接口》.
什么是epoll?
epoll是Linux下多路復用IO接口select/poll的增強版本,它能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率,因為它會復用文件描述符集 合來傳遞結果而不用迫使開發者每次等待事件之前都必須重新準備要被偵聽的文件描述符集合,另一點原因就是獲取事件的時候,它無須遍歷整個被偵聽的描述符 集,只要遍歷那些被內核IO事件異步喚醒而加入Ready隊列的描述符集合就行了。epoll除了提供select/poll那種IO事件的電平觸發 (Level Triggered)外,還提供了邊沿觸發(Edge Triggered),這就使得用戶空間程序有可能緩存IO狀態,減少epoll_wait/epoll_pwait的調用,提高應用程序效率。Linux2.6內核中對/dev/epoll設備的訪問的封裝(system epoll)。
這個使我們開發網絡應用程序更加簡單,并且更加高效。
為什么要使用epoll?
同樣,我們在linux系統下,影響效率的依然是I/O操作,linux提供給我們select/poll/epoll等多路復用I/O方式(kqueue暫時沒研究過),為什么我們對epoll情有獨鐘呢?原因如下:
1.文件描述符數量的對比。
epoll并沒有fd(文件描述符)的上限,它只跟系統內存有關,我的2G的ubuntu下查看是20480個,輕松支持20W個fd。可使用如下命令查看:
cat /proc/sys/fs/file-max再來看select/poll,有一個限定的fd的數量,linux/posix_types.h頭文件中
#define __FD_SETSIZE??? 10242.效率對比。
當然了,你可以修改上述值,然后重新編譯內核,然后再次寫代碼,這也是沒問題的,不過我先說說select/poll的機制,估計你馬上會作廢上面修改枚舉值的想法。
select/poll會因為監聽fd的數量而導致效率低下,因為它是輪詢所有fd,有數據就處理,沒數據就跳過,所以fd的數量會降低效率;而epoll只處理就緒的fd,它有一個就緒設備的隊列,每次只輪詢該隊列的數據,然后進行處理。(先簡單講一下,第二篇還會詳細講解)
3.內存處理方式對比。
不管是哪種I/O機制,都無法避免fd在操作過程中拷貝的問題,而epoll使用了mmap(是指文件/對象的內存映射,被映射到多個內存頁上),所以同一塊內存就可以避免這個問題。
btw:TCP/IP協議棧使用內存池管理sk_buff結構,你還可以通過修改內存池pool的大小,畢竟linux支持各種微調內核。
epoll的工作方式
epoll分為兩種工作方式LT和ET。
LT(level triggered) 是默認/缺省的工作方式,同時支持 block和no_block socket。這種工作方式下,內核會通知你一個fd是否就緒,然后才可以對這個就緒的fd進行I/O操作。就算你沒有任何操作,系統還是會繼續提示fd已經就緒,不過這種工作方式出錯會比較小,傳統的select/poll就是這種工作方式的代表。
ET(edge-triggered) 是高速工作方式,僅支持no_block socket,這種工作方式下,當fd從未就緒變為就緒時,內核會通知fd已經就緒,并且內核認為你知道該fd已經就緒,不會再次通知了,除非因為某些操作導致fd就緒狀態發生變化。如果一直不對這個fd進行I/O操作,導致fd變為未就緒時,內核同樣不會發送更多的通知,因為only once。所以這種方式下,出錯率比較高,需要增加一些檢測程序。
LT可以理解為水平觸發,只要有數據可以讀,不管怎樣都會通知。而ET為邊緣觸發,只有狀態發生變化時才會通知,可以理解為電平變化。
如何使用epoll?
使用epoll很簡單,只需要
#include <sys/epoll.h>有三個關鍵函數:
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_events* event);
int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);
當然了,不要忘記關閉函數.
?
============分割線==============
這篇就講到這里了,下面兩篇主要是函數介紹,效率分析,例子。
轉載請注明:C++愛好者博客???淺析epoll-為何多路復用I/O要使用epoll
總結
以上是生活随笔為你收集整理的浅析epoll-为何多路复用I/O要使用epoll的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析epoll – epoll函数深入讲
- 下一篇: 浅析epoll – epoll例子以及分