您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“I/O多路復用中select/poll/epoll有什么區別”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“I/O多路復用中select/poll/epoll有什么區別”這篇文章吧。
select,poll,epoll 都是 操作系統實現 IO 多路復用的機制。 我們知道,I/O 多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是 讀就緒或者寫就緒),能夠通知程序進行相應的讀寫操作。那么這三種機制有什 么區別呢。
1、支持一個進程所能打開的最大連接數
select:單個進程所能打開的最大連接數有 FD_SETSIZE 宏定義,其大 小是 32 個整數的大小(在 32 位的機器上,大小就是 32*32,同 理 64 位機器上 FD_SETSIZE 為 32*64),當然我們可以對進行修改, 然后重新編譯內核,但是性能可能會受到影響。
poll:poll 本質上和 select 沒有區別,但是它沒有最大連接數的限 制,原因是它是基于鏈表來存儲的。
epoll:雖然連接數有上限,但是很大,1G 內存的機器上可以打開 10 萬左右的連接,2G 內存的機器可以打開 20 萬左右的連
2、FD 劇增后帶來的 IO 效率問題
select:因為每次調用時都會對連接進行線性遍歷,所以隨著 FD 的 增加會造成遍歷速度慢的“線性下降性能問題”。
poll:同上。
epoll因為 epoll 內核中實現是根據每個 fd 上的 callback 函數來實 現的,只有活躍的 socket 才會主動調用 callback,所以在活躍 socket 較少的情況下,使用 epoll 沒有前面兩者的線性下降的性能 問題,但是所有 socket 都很活躍的情況下,可能會有性能問題。
3、 消息傳遞方式
select:內核需要將消息傳遞到用戶空間,都需要內核拷貝動作 。
poll:同上。
epoll:epoll 通過內核和用戶空間共享一塊內存來實現的。
總結:
綜上,在選擇 select,poll,epoll 時要根據具體的使用場合以及這三種方式 的自身特點。
1、表面上看 epoll 的性能最好,但是在連接數少并且連接都十分活躍的情況 下,select 和 poll 的性能可能比 epoll 好,畢竟 epoll 的通知機制需要很多函數回調。
2、select 低效是因為每次它都需要輪詢。但低效也是相對的,視情況而定, 也可通過良好的設計改善。
補充知識點:
Level_triggered(水平觸發):當被監控的文件描述符上有可讀寫事件發生時, epoll_wait()會通知處理程序去讀寫。如果這次沒有把數據一次性全部讀寫完(如 讀寫緩沖區太小),那么下次調用 epoll_wait()時,它還會通知你在上沒讀寫完的 文件描述符上繼續讀寫,當然如果你一直不去讀寫,它會一直通知你!!!如果 系統中有大量你不需要讀寫的就緒文件描述符,而它們每次都會返回,這樣會大 大降低處理程序檢索自己關心的就緒文件描述符的效率!!!
Edge_triggered(邊緣觸發):當被監控的文件描述符上有可讀寫事件發生時, epoll_wait()會通知處理程序去讀寫。如果這次沒有把數據全部讀寫完(如讀寫緩 沖區太小),那么下次調用 epoll_wait()時,它不會通知你,也就是它只會通知你 一次,直到該文件描述符上出現第二次可讀寫事件才會通知你!!!這種模式比 水平觸發效率高,系統不會充斥大量你不關心的就緒文件描述符!!
select(),poll()模型都是水平觸發模式,信號驅動 IO 是邊緣觸發模式,epoll() 模型即支持水平觸發,也支持邊緣觸發,默認是水平觸發。
以上是“I/O多路復用中select/poll/epoll有什么區別”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。