I/O多路復(fù)用中select/poll/epoll有什么區(qū)別

這篇文章主要為大家展示了“I/O多路復(fù)用中select/poll/epoll有什么區(qū)別”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“I/O多路復(fù)用中select/poll/epoll有什么區(qū)別”這篇文章吧。

成都創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元會(huì)澤做網(wǎng)站,已為上家服務(wù),為會(huì)澤各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

select,poll,epoll 都是 操作系統(tǒng)實(shí)現(xiàn) IO 多路復(fù)用的機(jī)制。 我們知道,I/O 多路復(fù)用就通過(guò)一種機(jī)制,可以監(jiān)視多個(gè)描述符,一旦某個(gè)描述符就緒(一般是 讀就緒或者寫就緒),能夠通知程序進(jìn)行相應(yīng)的讀寫操作。那么這三種機(jī)制有什 么區(qū)別呢。 
1、支持一個(gè)進(jìn)程所能打開的最大連接數(shù)
select:?jiǎn)蝹€(gè)進(jìn)程所能打開的最大連接數(shù)有 FD_SETSIZE 宏定義,其大 小是 32 個(gè)整數(shù)的大?。ㄔ?32 位的機(jī)器上,大小就是 32*32,同 理 64 位機(jī)器上 FD_SETSIZE 為 32*64),當(dāng)然我們可以對(duì)進(jìn)行修改, 然后重新編譯內(nèi)核,但是性能可能會(huì)受到影響。
poll:poll 本質(zhì)上和 select 沒有區(qū)別,但是它沒有最大連接數(shù)的限 制,原因是它是基于鏈表來(lái)存儲(chǔ)的。
epoll:雖然連接數(shù)有上限,但是很大,1G 內(nèi)存的機(jī)器上可以打開 10 萬(wàn)左右的連接,2G 內(nèi)存的機(jī)器可以打開 20 萬(wàn)左右的連
2、FD 劇增后帶來(lái)的 IO 效率問(wèn)題
select:因?yàn)槊看握{(diào)用時(shí)都會(huì)對(duì)連接進(jìn)行線性遍歷,所以隨著 FD 的 增加會(huì)造成遍歷速度慢的“線性下降性能問(wèn)題”。 
poll:同上。
epoll因?yàn)?epoll 內(nèi)核中實(shí)現(xiàn)是根據(jù)每個(gè) fd 上的 callback 函數(shù)來(lái)實(shí) 現(xiàn)的,只有活躍的 socket 才會(huì)主動(dòng)調(diào)用 callback,所以在活躍 socket 較少的情況下,使用 epoll 沒有前面兩者的線性下降的性能 問(wèn)題,但是所有 socket 都很活躍的情況下,可能會(huì)有性能問(wèn)題。 
3、 消息傳遞方式
select:內(nèi)核需要將消息傳遞到用戶空間,都需要內(nèi)核拷貝動(dòng)作 。
poll:同上。
epoll:epoll 通過(guò)內(nèi)核和用戶空間共享一塊內(nèi)存來(lái)實(shí)現(xiàn)的。

總結(jié): 
綜上,在選擇 select,poll,epoll 時(shí)要根據(jù)具體的使用場(chǎng)合以及這三種方式 的自身特點(diǎn)。
1、表面上看 epoll 的性能最好,但是在連接數(shù)少并且連接都十分活躍的情況 下,select 和 poll 的性能可能比 epoll 好,畢竟 epoll 的通知機(jī)制需要很多函數(shù)回調(diào)。
2、select 低效是因?yàn)槊看嗡夹枰喸?。但低效也是相?duì)的,視情況而定, 也可通過(guò)良好的設(shè)計(jì)改善。

補(bǔ)充知識(shí)點(diǎn):
Level_triggered(水平觸發(fā)):當(dāng)被監(jiān)控的文件描述符上有可讀寫事件發(fā)生時(shí), epoll_wait()會(huì)通知處理程序去讀寫。如果這次沒有把數(shù)據(jù)一次性全部讀寫完(如 讀寫緩沖區(qū)太小),那么下次調(diào)用 epoll_wait()時(shí),它還會(huì)通知你在上沒讀寫完的 文件描述符上繼續(xù)讀寫,當(dāng)然如果你一直不去讀寫,它會(huì)一直通知你?。?!如果 系統(tǒng)中有大量你不需要讀寫的就緒文件描述符,而它們每次都會(huì)返回,這樣會(huì)大 大降低處理程序檢索自己關(guān)心的就緒文件描述符的效率!??!
Edge_triggered(邊緣觸發(fā)):當(dāng)被監(jiān)控的文件描述符上有可讀寫事件發(fā)生時(shí), epoll_wait()會(huì)通知處理程序去讀寫。如果這次沒有把數(shù)據(jù)全部讀寫完(如讀寫緩 沖區(qū)太小),那么下次調(diào)用 epoll_wait()時(shí),它不會(huì)通知你,也就是它只會(huì)通知你 一次,直到該文件描述符上出現(xiàn)第二次可讀寫事件才會(huì)通知你?。?!這種模式比 水平觸發(fā)效率高,系統(tǒng)不會(huì)充斥大量你不關(guān)心的就緒文件描述符?。?br/>select(),poll()模型都是水平觸發(fā)模式,信號(hào)驅(qū)動(dòng) IO 是邊緣觸發(fā)模式,epoll() 模型即支持水平觸發(fā),也支持邊緣觸發(fā),默認(rèn)是水平觸發(fā)。

以上是“I/O多路復(fù)用中select/poll/epoll有什么區(qū)別”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

名稱欄目:I/O多路復(fù)用中select/poll/epoll有什么區(qū)別
URL地址:http://bm7419.com/article44/jdsghe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作云服務(wù)器、網(wǎng)站維護(hù)、App開發(fā)、建站公司、企業(yè)網(wǎng)站制作

廣告

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

成都seo排名網(wǎng)站優(yōu)化