日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

浅析epoll-为何多路复用I/O要使用epoll

發(fā)布時(shí)間:2024/9/3 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析epoll-为何多路复用I/O要使用epoll 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文轉(zhuǎn)自C++愛(ài)好者博客?http://www.cppfans.org/author/eliteyang,順便記錄一下自己學(xué)習(xí)epoll的過(guò)程。


現(xiàn)如今,網(wǎng)絡(luò)通訊中用epoll(linux)和IOCP(windows)幾乎是大家津津樂(lè)道的東西,不為別的,就因?yàn)楦咝?#xff0c;所以大家喜歡用。IOCP的基礎(chǔ)東西已經(jīng)講過(guò)了,可翻閱《IOCP淺析》?《IOCP淺析[二]——IOCP出現(xiàn)的意義和函數(shù)接口》.

什么是epoll

epoll是Linux下多路復(fù)用IO接口select/poll的增強(qiáng)版本,它能顯著提高程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)CPU利用率,因?yàn)樗鼤?huì)復(fù)用文件描述符集 合來(lái)傳遞結(jié)果而不用迫使開(kāi)發(fā)者每次等待事件之前都必須重新準(zhǔn)備要被偵聽(tīng)的文件描述符集合,另一點(diǎn)原因就是獲取事件的時(shí)候,它無(wú)須遍歷整個(gè)被偵聽(tīng)的描述符 集,只要遍歷那些被內(nèi)核IO事件異步喚醒而加入Ready隊(duì)列的描述符集合就行了。epoll除了提供select/poll那種IO事件的電平觸發(fā) (Level Triggered)外,還提供了邊沿觸發(fā)(Edge Triggered),這就使得用戶空間程序有可能緩存IO狀態(tài),減少epoll_wait/epoll_pwait的調(diào)用,提高應(yīng)用程序效率。Linux2.6內(nèi)核中對(duì)/dev/epoll設(shè)備的訪問(wèn)的封裝(system epoll)。

這個(gè)使我們開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用程序更加簡(jiǎn)單,并且更加高效。

為什么要使用epoll?

同樣,我們?cè)趌inux系統(tǒng)下,影響效率的依然是I/O操作,linux提供給我們select/poll/epoll等多路復(fù)用I/O方式(kqueue暫時(shí)沒(méi)研究過(guò)),為什么我們對(duì)epoll情有獨(dú)鐘呢?原因如下:

1.文件描述符數(shù)量的對(duì)比。

epoll并沒(méi)有fd(文件描述符)的上限,它只跟系統(tǒng)內(nèi)存有關(guān),我的2G的ubuntu下查看是20480個(gè),輕松支持20W個(gè)fd。可使用如下命令查看:

cat /proc/sys/fs/file-max

再來(lái)看select/poll,有一個(gè)限定的fd的數(shù)量,linux/posix_types.h頭文件中

#define __FD_SETSIZE??? 1024

2.效率對(duì)比。

當(dāng)然了,你可以修改上述值,然后重新編譯內(nèi)核,然后再次寫(xiě)代碼,這也是沒(méi)問(wèn)題的,不過(guò)我先說(shuō)說(shuō)select/poll的機(jī)制,估計(jì)你馬上會(huì)作廢上面修改枚舉值的想法。

select/poll會(huì)因?yàn)楸O(jiān)聽(tīng)fd的數(shù)量而導(dǎo)致效率低下,因?yàn)樗禽喸兯衒d,有數(shù)據(jù)就處理,沒(méi)數(shù)據(jù)就跳過(guò),所以fd的數(shù)量會(huì)降低效率;而epoll只處理就緒的fd,它有一個(gè)就緒設(shè)備的隊(duì)列,每次只輪詢?cè)撽?duì)列的數(shù)據(jù),然后進(jìn)行處理。(先簡(jiǎn)單講一下,第二篇還會(huì)詳細(xì)講解)

3.內(nèi)存處理方式對(duì)比。

不管是哪種I/O機(jī)制,都無(wú)法避免fd在操作過(guò)程中拷貝的問(wèn)題,而epoll使用了mmap(是指文件/對(duì)象的內(nèi)存映射,被映射到多個(gè)內(nèi)存頁(yè)上),所以同一塊內(nèi)存就可以避免這個(gè)問(wèn)題。

btw:TCP/IP協(xié)議棧使用內(nèi)存池管理sk_buff結(jié)構(gòu),你還可以通過(guò)修改內(nèi)存池pool的大小,畢竟linux支持各種微調(diào)內(nèi)核。

epoll的工作方式

epoll分為兩種工作方式LT和ET。

LT(level triggered) 是默認(rèn)/缺省的工作方式,同時(shí)支持 block和no_block socket。這種工作方式下,內(nèi)核會(huì)通知你一個(gè)fd是否就緒,然后才可以對(duì)這個(gè)就緒的fd進(jìn)行I/O操作。就算你沒(méi)有任何操作,系統(tǒng)還是會(huì)繼續(xù)提示fd已經(jīng)就緒,不過(guò)這種工作方式出錯(cuò)會(huì)比較小,傳統(tǒng)的select/poll就是這種工作方式的代表。

ET(edge-triggered) 是高速工作方式,僅支持no_block socket,這種工作方式下,當(dāng)fd從未就緒變?yōu)榫途w時(shí),內(nèi)核會(huì)通知fd已經(jīng)就緒,并且內(nèi)核認(rèn)為你知道該fd已經(jīng)就緒,不會(huì)再次通知了,除非因?yàn)槟承┎僮鲗?dǎo)致fd就緒狀態(tài)發(fā)生變化。如果一直不對(duì)這個(gè)fd進(jìn)行I/O操作,導(dǎo)致fd變?yōu)槲淳途w時(shí),內(nèi)核同樣不會(huì)發(fā)送更多的通知,因?yàn)閛nly once。所以這種方式下,出錯(cuò)率比較高,需要增加一些檢測(cè)程序。

LT可以理解為水平觸發(fā),只要有數(shù)據(jù)可以讀,不管怎樣都會(huì)通知。而ET為邊緣觸發(fā),只有狀態(tài)發(fā)生變化時(shí)才會(huì)通知,可以理解為電平變化。

如何使用epoll?

使用epoll很簡(jiǎn)單,只需要

#include <sys/epoll.h>

有三個(gè)關(guān)鍵函數(shù):

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);

當(dāng)然了,不要忘記關(guān)閉函數(shù).

?

============分割線==============

這篇就講到這里了,下面兩篇主要是函數(shù)介紹,效率分析,例子。

轉(zhuǎn)載請(qǐng)注明:C++愛(ài)好者博客???淺析epoll-為何多路復(fù)用I/O要使用epoll

總結(jié)

以上是生活随笔為你收集整理的浅析epoll-为何多路复用I/O要使用epoll的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。