溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-12-03 16:14:34 來源:億速云 閱讀:153 作者:小新 欄目:大數(shù)據(jù)

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

select,poll,epoll 都是 操作系統(tǒng)實(shí)現(xiàn) IO 多路復(fù)用的機(jī)制。 我們知道,I/O 多路復(fù)用就通過一種機(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ù)的限 制,原因是它是基于鏈表來存儲(chǔ)的。
epoll:雖然連接數(shù)有上限,但是很大,1G 內(nèi)存的機(jī)器上可以打開 10 萬左右的連接,2G 內(nèi)存的機(jī)器可以打開 20 萬左右的連
2、FD 劇增后帶來的 IO 效率問題
select:因?yàn)槊看握{(diào)用時(shí)都會(huì)對(duì)連接進(jìn)行線性遍歷,所以隨著 FD 的 增加會(huì)造成遍歷速度慢的“線性下降性能問題”。 
poll:同上。
epoll因?yàn)?epoll 內(nèi)核中實(shí)現(xiàn)是根據(jù)每個(gè) fd 上的 callback 函數(shù)來實(shí) 現(xiàn)的,只有活躍的 socket 才會(huì)主動(dòng)調(diào)用 callback,所以在活躍 socket 較少的情況下,使用 epoll 沒有前面兩者的線性下降的性能 問題,但是所有 socket 都很活躍的情況下,可能會(huì)有性能問題。 
3、 消息傳遞方式
select:內(nèi)核需要將消息傳遞到用戶空間,都需要內(nèi)核拷貝動(dòng)作 。
poll:同上。
epoll:epoll 通過內(nèi)核和用戶空間共享一塊內(nè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)槊看嗡夹枰喸儭5托б彩窍鄬?duì)的,視情況而定, 也可通過良好的設(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)心的就緒文件描述符!!
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)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI