五種網絡IO模型以及多路復用IO中select/epoll對比


下面都是以網絡讀數據為例

【2階段網絡IO】

第一階段:等待數據 wait for data

第二階段:從內核復制數據到用戶 copy data from kernel to user

下面是5種網絡IO模型

https://img2.mukewang.com/5b28d3da0001ea4e07560430.jpg

【阻塞blocking IO】

兩階段全程阻塞

recvfrom -> [syscall -> wait -> copy ->] return OK

https://img.mukewang.com/5b28d3f6000184cc07740430.jpg

【非阻塞nonblocking IO】

第一階段是非阻塞的不斷檢查是否數據准備好,第二階段阻塞讀取數據

recvfrom -> [syscall -> wait ->] return no data ready

recvfrom -> [syscall -> wait ->] return no data ready

recvfrom -> [syscall -> wait ->] return ready

recvfrom -> [syscall -> copy ->] return OK

https://img4.mukewang.com/5b28d4040001cc5007650430.jpg

【多路復用IO multiplexing】

每個IO都是非阻塞IO,第一階段通過select/poll方法,一次性輪詢多個IO句柄,檢查是否有IO句柄准備好,第二階段阻塞讀取數據

select/pool -> [syscall -> wait ->] return readable

recvfrom -> [syscall -> copy ->] return OK

https://img.mukewang.com/5b28d41600019b7e07560430.jpg

【信號驅動signal driven IO】

第一階段構造一個信號處理器,第二階段阻塞讀取數據

signal handle -> [syscall -> wait ->] return

[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK

https://img3.mukewang.com/5b28d4200001ffc707560430.jpg

【異步asynchronous IO】

兩階段都是非阻塞

aio_read -> [syscall -> wait ->] return

[syscall -> copy ->] aio_read callback

https://img2.mukewang.com/5b28ce2300011fc009600720.jpg

5種網絡IO對比,只有aio才是全程非阻塞,其它4種都是同步IO。

阻塞IO編程簡單,這種方式使用很廣泛,但是效率較低。

非阻塞IO效率較高,但是編程較復雜,有開發語言和代碼庫支持就簡單多了。

多路復用非阻塞IO效率比非阻塞IO更高,在大規模的網絡IO處理中尤其明顯,支持的程序也越來越多。

異步IO效率很高,但是編程很復雜。node.js中使用的就是異步IO。

https://img1.mukewang.com/5b28d43c00011d7406320177.jpg

【select / epoll 對比】

select不足的地方:

1 每次select都要把全部IO句柄復制到內核

2 內核每次都要遍歷全部IO句柄,以判斷是否數據准備好

3 select模式最大IO句柄數是1024,太多了性能下降明顯

 

epoll的特點

1 每次新建IO句柄(epoll_create)才復制並注冊(epoll_ctl)到內核

2 內核根據IO事件,把准備好的IO句柄放到就緒隊列

3 應用只要輪詢(epoll_wait)就緒隊列,然后去讀取數據

只需要輪詢就緒隊列(數量少),不存在select的輪詢,也沒有內核的輪詢,不需要多次復制所有的IO句柄。因此,可以同時支持的IO句柄數輕松過百萬。

 

網絡編程,一定要非常了解網絡IO模型,對系統設計和架構選型才能有更好的選擇和把握。

在實戰課程 《PHP秒殺系統 高並發高性能的極致挑戰》中,也是針對這類高並發的業務場景做了特定的性能優化以及分布式方案,大家可以參考學習。


作者:一凡Sir
鏈接:https://www.imooc.com/article/37093
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com