真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

select、poll、epoll的區(qū)別總結(jié)

select,poll,epoll都是IO多路復(fù)用的機(jī)制。I/O多路復(fù)用就通過一種機(jī)制,可以監(jiān)視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進(jìn)行相應(yīng)的讀寫操作

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出杞縣免費做網(wǎng)站回饋大家。

但select,poll,epoll本質(zhì)上都是同步I/O,因為他們都需要在讀寫事件就緒后自己負(fù)責(zé)進(jìn)行讀寫,也就是說這個讀寫過程是阻塞的,而異步I/O則無需自己負(fù)責(zé)進(jìn)行讀寫,異步I/O的實現(xiàn)會負(fù)責(zé)把數(shù)據(jù)從內(nèi)核拷貝到用戶空間

三組IO復(fù)用函數(shù)的比較

select:

select系統(tǒng)調(diào)用的用途是:在一段指定時間內(nèi),監(jiān)聽用戶所感興趣的文件描述符上的可讀、可寫和異常事件

缺點:

1.所能監(jiān)視的文件描述符的數(shù)量有限制,sizeof(fd_set)=128,說明能監(jiān)視的描述符的最大值為128*8=1024個

2.同時每次調(diào)用select都需要在內(nèi)核遍歷傳遞進(jìn)來的所有fd,當(dāng)fd很多時性能會下降

3.由于當(dāng)有事件發(fā)生時,select返回后會修改三個事件集,所以,每次都需要把fd集合從用戶區(qū)拷貝到內(nèi)核區(qū),當(dāng)需要監(jiān)視的fd數(shù)量增多時,性能會下降

適用場景:

適用于所監(jiān)視的文件描述符數(shù)量較少的場景

poll:

poll系統(tǒng)調(diào)用和select類似,也是在制定時間內(nèi)輪詢一定數(shù)量的文件描述符,以測試其中是否有就緒的文件描述符

優(yōu)點:

1.相比select來講,它沒有fd數(shù)量的限制,理論上打開fd的數(shù)目跟系統(tǒng)內(nèi)在有關(guān)

2.也不用每次都把fd集合從用戶區(qū)拷貝數(shù)據(jù)到內(nèi)核,它使用一個  struct pollfd結(jié)構(gòu)體來維護(hù)每個fd

缺點:

它本質(zhì)上是和selece一樣的,只是描述fd集合的方式不同,poll使用pollfd結(jié)構(gòu)而不是select的fd_set結(jié)構(gòu),其他的都差不多

適用場景:

也適用于所監(jiān)視文件描述符少的場景

epoll:

epoll是Linux特有的IO復(fù)用函數(shù),被認(rèn)為性能最好的一種方法,

它和select、poll在實現(xiàn)和使用上有很大差異:

  1.使用一組函數(shù)來完成,而不是單個

  2. 把用戶關(guān)心的文件描述符上的事件放在內(nèi)核的一個事件表中,無須向select、poll那樣每次調(diào)用都要重復(fù)傳入文件描述符集或事件集,但epoll需要用一個額外的文件描述符來表示內(nèi)核中的這個事件表

epoll函數(shù)非常簡單,有epoll_create,epoll_ctl,epoll_wait3個函數(shù),先使epoll_create創(chuàng)建一個epoll的句柄,再通過epoll_ctl注冊事件,然后epoll_wait檢測事件的發(fā)生

優(yōu)點:

具備了select所不具備的所有優(yōu)點

1.沒有fd數(shù)量的限制,它所支持的fd上限是最大可以打開文件的數(shù)目,具體數(shù)目可cat/proc/sys/fs/file-max察看,一般來說這個數(shù)目和系統(tǒng)內(nèi)存關(guān)系很大

2.epoll_ctl每次注冊新的事件到epoll句柄中時(在epoll_ctl中指定EPOLL_CTL_ADD),會把所有的fd拷貝進(jìn)內(nèi)核,而不是在epoll_wait的時候重復(fù)拷貝,epoll保證了每個fd在整個過程中只會拷貝一次

3.epoll的解決方案不像select或poll一樣每次都把current輪流加入fd對應(yīng)的設(shè)備等待隊列中,而只在epoll_ctl時把current掛一遍(這一遍必不可少)并為每個fd指定一個回調(diào)函數(shù),當(dāng)設(shè)備就緒,喚醒等待隊列上的等待者時,就會調(diào)用這個回調(diào)函數(shù),而這個回調(diào)函數(shù)會把就緒的fd加入一個就緒鏈表)。epoll_wait的工作實際上就是在這個就緒鏈表中查看有沒有就緒的fd

適用場景:

當(dāng)活動連接比較多的時候,epoll_wait的效率未必比select和poll高,因為此時回調(diào)函數(shù)被觸發(fā)的過于頻繁,因此epoll_wait適用于連接數(shù)量多,但活動連接較少的情況

epoll對文件描述符的操作有兩種模式:LT和ET

LT(水平觸發(fā)):這種模式是默認(rèn)的工作模式,此時,epoll相當(dāng)于效率較高的poll,

                當(dāng)往epoll內(nèi)核事件表中注冊一個文件描述符上的EPOLLET事件時,epoll將以ET模式來操作該文件描述符

ET(邊沿觸發(fā)):ET模式是epoll的高效工作模式,它在很大程度上降低了同一個epoll事件被重復(fù)觸發(fā)的次數(shù)


總結(jié):

這3組IO復(fù)用系統(tǒng)調(diào)用都能同時監(jiān)聽多個文件描述符,它們將等待由timeout參數(shù)指定的超時時間,直到一個或者多個文件描述符上有時間發(fā)生時返回,返回值就是就緒的文件描述符的數(shù)量,返回0表示沒有事件發(fā)生。

這3組函數(shù)都通過某種結(jié)構(gòu)體變量來告訴內(nèi)核監(jiān)聽哪些文件描述符上的那些事件,并使用該結(jié)構(gòu)體類型的參數(shù)來獲取內(nèi)核處理的結(jié)果。

select的參數(shù)類型fd_set,沒有將文件描述符集合事件綁定,它僅僅是一個文件描述符集合,因此select需要提供3個這種類型的參數(shù)來分別傳入和輸出可讀可寫異常事件,這一方面使得select不能處理更多類型的事件,另一方面由于內(nèi)核對fd_set集合的在線修改,應(yīng)用程序下次調(diào)用select前不得不重置這3個fd_set集合。

poll的參數(shù)類型pollfd,它把文件描述符和事件都定義其中,任何事件都被統(tǒng)一處理,從而使編程接口簡潔的多。并且內(nèi)核每次修改的是pollfd結(jié)構(gòu)體的revents成員,而events成員保持不變,因此下次調(diào)用poll時應(yīng)用程序無須重置pollfd類型的事件集。

epoll使用一個獨立的系統(tǒng)調(diào)用epoll_ctl來控制往其中添加、修改、刪除事件。這樣每次epoll_wait調(diào)用都直接從該內(nèi)核事件表中取得用戶注冊的時間,而無須反復(fù)從用戶空間讀入這些事件,epoll_wait系統(tǒng)調(diào)用的events參數(shù)僅用來返回就緒的事件,這使得應(yīng)用程序索引就緒文件描述符的時間復(fù)雜度達(dá)到O(1)。

poll和epoll_wait分別用nfds和maxevents參數(shù)指定最多監(jiān)聽多少個文件描述符和事件,這兩個數(shù)值都能達(dá)到系統(tǒng)允許打開的最大文件描述符數(shù)目,我的系統(tǒng)下是48428select、poll、epoll的區(qū)別總結(jié)

而select允許監(jiān)聽的文件描述符數(shù)量通常是有限的,測試結(jié)果為128*8=1024個

select、poll、epoll的區(qū)別總結(jié)

select和poll都只能工作在相對低效的LT模式下,而epoll則可以工作在ET高效模式,并且epoll還支持EPOLLONESHOT事件,該事件能進(jìn)一步減少可讀、可寫和異常事件被觸發(fā)的次數(shù)。

select采用的都是輪詢的方式,即每次調(diào)用都要掃描整個注冊文件描述符集合,epoll_wait采用的是回調(diào)的方式,內(nèi)核檢測到就緒的文件文件描述符時,將觸發(fā)回調(diào)函數(shù),回調(diào)函數(shù)就將該文件描述符上對應(yīng)的事件插入內(nèi)核就緒事件隊列。內(nèi)核最后在適當(dāng)?shù)臅r機(jī)將該就緒事件隊列中的內(nèi)容拷貝到用戶空間,因此epoll無需輪詢整個文件描述符集合來檢測哪些事件已經(jīng)就緒,當(dāng)活動連接比較多的時候,epoll_wait的效率未必比select和poll高,因為此時回調(diào)函數(shù)被觸發(fā)的過于頻繁,因此epoll_wait適用于連接數(shù)量多,但活動連接較少的情況。

《完》


網(wǎng)站題目:select、poll、epoll的區(qū)別總結(jié)
文章路徑:http://weahome.cn/article/gioeio.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部