IO多路復用--epoll-創(chuàng)新互聯(lián)

epoll就是為了 處理大批量句柄而改進的poll,相比與select,poll大的好處在于它不會隨著堅挺fd的數(shù)目增長而效率降低。因為在內(nèi)核中的select是采用輪詢來處理的,輪詢fd的數(shù)目越多,自然耗時越多,并且slelct的監(jiān)聽數(shù)目有限(雖然可以通過頭文件來改變,但并不治本)

創(chuàng)新互聯(lián)成立十載來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供成都做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計、域名注冊、網(wǎng)絡(luò)營銷、VI設(shè)計、網(wǎng)站改版、漏洞修補等服務(wù)。網(wǎng)站是否美觀、功能強大、用戶體驗好、性價比高、打開快等等,這些對于網(wǎng)站建設(shè)都非常重要,創(chuàng)新互聯(lián)通過對建站技術(shù)性的掌握、對創(chuàng)意設(shè)計的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進步。

一.epoll的相關(guān)系統(tǒng)調(diào)用

epoll只有三個簡單地接口 分別為epoll_creat,epoll_ctl,epoll_wait

(1)int epoll_creat(int size)

  創(chuàng)建一個epoll句柄,當創(chuàng)建好一個epoll句柄后,它就會占一個 fd值,所以在使用完以后要調(diào)用close()函數(shù)關(guān)閉,否則fd可能被耗盡

(2)int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event)

  epoll的事件注冊函數(shù),它不同于 select函數(shù)在監(jiān)聽事件的時候告訴內(nèi)核要監(jiān)聽什么類型的事件,而是 在 這里先注冊要監(jiān)聽的事件類型

 第一個參數(shù)是epoll_creat的返回值

 第二個參數(shù)表示動作,用三個宏來表示

 EPOLL_CTL_ADD:注冊新的fd到epfd中

EPOLL_CTL_MOD;修改已經(jīng)注冊到的fd的監(jiān)聽事件

EPOLL_CTL_DEL:從epfd中刪除一個fd

第三個參數(shù) 是 要監(jiān)聽 的fd

第四個參數(shù) 告訴內(nèi)核 需要監(jiān)聽什么 事件

event可以是以下幾個 宏的集合

EPOLLIN:表示 對應的文件描述符可以讀(包括對socket正常關(guān)閉)

EPOLLOUT:表示 對應的文件描述符可以寫

EPOLLPRI:表示對應的文件描述符有緊急的數(shù)據(jù)可讀

EPOLLERR:對應的文件描述符發(fā)生錯誤

EPOLLET:將EPOLL設(shè)置為 邊沿除法模式 ,這是相對于水平觸發(fā)而言

EPOLLONESET:只監(jiān)聽一次事件,如果之后還需要監(jiān)聽的話,需要再次把這個socket鍵入到EPOLL隊列里

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

   收集epoll監(jiān)控的事件中已經(jīng)發(fā)生的事件參數(shù)event是分配好的epoll_event結(jié)構(gòu)體數(shù)組。epoll把發(fā)生的事件賦值到events數(shù)組中 (events不可以是空指針,內(nèi)核只負責把數(shù)據(jù)復制到數(shù)組中,但不會幫用戶開辟內(nèi)存),maxevents告訴這個內(nèi)核有多大這個maxevents的值不能大于創(chuàng)建的epoll_ctreat()時的size,闡述timeout是超時事件(毫秒 ,0立即返回,-1將不確定,也就是永久阻塞)如果函數(shù)調(diào)用成功,返回對應已準備好的文件描述符數(shù)目,如果返回0表示超時

二. epoll工作原理

epoll只告訴那些就緒的文件描述符,而且當你調(diào)用epoll_wait()獲得就緒文件描述符的時候,返回的不是實際的文件描述符,而是一個代表就緒描述符數(shù)量值,你只是需要去epoll指定的一個數(shù)組 中一次獲得相應數(shù)量的文件描述符即可。

 另一個本質(zhì)的改進在于epoll采用基于 事件的就緒通知方式,在select/poll中進程只有在調(diào)用一定的方法之后,內(nèi)核才對所有監(jiān)視的文件描述符進行掃描,而epoll先通過采用epoll_ctl()來注冊一個文件描述符,當進程調(diào)用epoll_wait()時便得到通知。

三. epoll的工作方式-水平觸發(fā)(LT)-邊沿觸發(fā)(ET)

LT(level triggered)是epoll缺省的工作方式,并且同時支持block和no-block socket.在這種做法中,內(nèi)核告訴你一個文件描述符是否就緒了,然后你可以對這個就緒的fd進行IO操作。如果你不作任何操作,內(nèi)核還是會繼續(xù)通知你 的,所以,這種模式編程出錯誤可能性要小一點。傳統(tǒng)的select/poll都是這種模型的代表.

ET (edge-triggered)是高速工作方式,只支持no-block socket,它效率要比LT更高。ET與LT的區(qū)別在于,當一個新的事件到來時,ET模式下當然可以從epoll_wait調(diào)用中獲取到這個事件,可是如果這次沒有把這個事件對應的套接字緩沖區(qū)處理完,在這個套接字中沒有新的事件再次到來時,在ET模式下是無法再次從epoll_wait調(diào)用中獲取這個事件的。而LT模式正好相反,只要一個事件對應的套接字緩沖區(qū)還有數(shù)據(jù),就總能從epoll_wait中獲取這個事件。

因此,LT模式下開發(fā)基于epoll的應用要簡單些,不太容易出錯。而在ET模式下事件發(fā)生時,如果沒有徹底地將緩沖區(qū)數(shù)據(jù)處理完,則會導致緩沖區(qū)中的用戶請求得不到響應

四.epoll的優(yōu)點

(1)支持一個進程打開大數(shù)目的socket描述符(FD)

select所能夠打開的fd是有限的一般為1024,對于那些支持上萬條鏈接數(shù)目的服務(wù)器來說 太少了,epoll就沒有這個限制 ,它所支持的FD上限是大可以打開文件數(shù)目這個樹種子一般大于2048;

(2)IO效率不隨FD的數(shù)目 增加而線性下降

 傳統(tǒng)的select/poll致命弱點是當擁有一個很大的集合的時候,每次都用都會輪詢掃描 集合 ,導致效率下降,但是epoll只對活躍 的socket進行操作--因為在內(nèi)核中epoll根據(jù)每個fd上面的callback函數(shù)實現(xiàn)的,只有活躍的函數(shù) 才會 調(diào)用 callback函數(shù)

五.linux下epoll如何處理百萬句柄

(1)首先調(diào)用epoll_creat建立一個epoll對象,參數(shù) size是內(nèi)核保證能夠正確處理的大句柄數(shù)

(2)epoll_ctl操作上面建立好的epoll,例如讓剛建立的socket加入到epoll中讓其監(jiān)控,或者把epoll正在監(jiān)控的某個socke句柄移除epoll

(3)epoll_wait在給定的timeout時間內(nèi)當監(jiān)控的所有句柄發(fā)審核變化時就返回用戶態(tài)進程(毫秒 ,0立即返回,-1將不確定,也就是永久阻塞)如果函數(shù)調(diào)用成功,返回對應已準備好的文件描述符數(shù)目,如果返回0表示超時

從上面調(diào)用方式可以看出epoll比select/poll的優(yōu)越之處:因為 后者每次調(diào)用時都會給你返回所要監(jiān)控所有socket給select/poll系統(tǒng) 調(diào)用 ,這意味著需要將用戶態(tài)的socket列表 拷貝到內(nèi)核態(tài),如果數(shù)以萬計的句柄會導致每次都要copy幾十幾百KB的內(nèi)存到內(nèi)核態(tài),非常低效,但epoll_wait不用傳遞socket句柄給內(nèi)核,因為內(nèi)核已經(jīng)在 epoll_ctl中拿到了要監(jiān)控的句柄列表

下面是代碼部分

1.創(chuàng)建監(jiān)聽套接字,設(shè)置端口服用127.0.0.1 指定簇為 IPv4,指定端口號并 轉(zhuǎn)化為 網(wǎng)絡(luò)字節(jié)序列,指定ip地址并轉(zhuǎn)化為 網(wǎng)絡(luò) 字節(jié)序列

IO多路復用--epoll

IO多路復用--epoll

2.調(diào)用epoll_creat得到一個epoll模型,判斷若創(chuàng)建成功,則調(diào)用epoll_ctl函數(shù)注冊要監(jiān)聽事件的類型 ,本代碼中設(shè)置的監(jiān)聽事件類型為EPOLLIN:表示 對應的文件描述符可以讀

 epoll的事件注冊函數(shù),它不同于 select函數(shù)在監(jiān)聽事件的時候告訴內(nèi)核要監(jiān)聽什么類型的事件,而是 在 這里先注冊要監(jiān)聽的事件類型

 第一個參數(shù)是epoll_creat的返回值

 第二個參數(shù)表示動作,用三個宏來表示

 EPOLL_CTL_ADD:注冊新的fd到epfd中

EPOLL_CTL_MOD;修改已經(jīng)注冊到的fd的監(jiān)聽事件

EPOLL_CTL_DEL:從epfd中刪除一個fd

第三個參數(shù) 是 要監(jiān)聽 的fd

第四個參數(shù) 告訴內(nèi)核 需要監(jiān)聽什么 事件

event可以是以下幾個 宏的集合

EPOLLIN:表示 對應的文件描述符可以讀(包括對socket正常關(guān)閉)

EPOLLOUT:表示 對應的文件描述符可以寫

EPOLLPRI:表示對應的文件描述符有緊急的數(shù)據(jù)可讀

EPOLLERR:對應的文件描述符發(fā)生錯誤

EPOLLET:將EPOLL設(shè)置為 邊沿除法模式 ,這是相對于水平觸發(fā)而言

EPOLLONESET:只監(jiān)聽一次事件,如果之后還需要監(jiān)聽的話,需要再次把這個socket鍵入到EPOLL隊列里

IO多路復用--epoll

3.調(diào)用epoll_wait函數(shù)收集epoll監(jiān)控的事件中已經(jīng)發(fā)生的事件,參數(shù)event是分配好的epoll_event結(jié)構(gòu)體數(shù)組。epoll把發(fā)生的事件賦值到events數(shù)組中 (events不可以是空指針,內(nèi)核只負責把數(shù)據(jù)復制到數(shù)組中,但不會幫用戶開辟內(nèi)存),maxevents告訴這個內(nèi)核有多大這個maxevents的值不能大于創(chuàng)建的epoll_ctreat()時的size,

   闡述timeout是超時事件(毫秒 ,0立即返回,-1將不確定,也就是永久阻塞)如果函數(shù)調(diào)用成功,返回對應已準備好的文件描述符數(shù)目,如果返回0表示超時

   判斷它是否為 監(jiān)聽套接字,如果是并且就緒  則對它進行接收,并且以邊沿出讓的方式讀入 ,若是其他套接字 ,則對他進行同樣的 接收

IO多路復用--epoll

IO多路復用--epoll

IO多路復用--epoll

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

名稱欄目:IO多路復用--epoll-創(chuàng)新互聯(lián)
新聞來源:http://bm7419.com/article36/dpdhpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、做網(wǎng)站靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計、外貿(mào)建站、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司