深刻了解Netty【四】IO模型


引言

IO模型就是操做數據輸入輸出的方式,在Linux系統中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO複用模型、信號驅動式IO模型、異步IO模型。 由於學習Netty必不可少的要了解IO多路複用模型,本篇是基礎。編程

名詞概念

  • 阻塞:指向調用方,在調用結果返回以前,調用方線程會掛起,直到結果返回。
  • 非阻塞:指向調用方,在調用結果返回以前,調用方線程會處理其餘事情,不會阻塞。
  • 同步:指向被調用方,被調用方獲得結果後再返回給調用方。
  • 異步:指向被調用方,被調用方先應答調用方,而後計算結果,最終通知並返回給調用方。
  • recvfrom函數:系統調用,經socket接收數據。

5中IO模型

一、阻塞式IO模型(blocking I/O)

阻塞式IO模型.png 進程調用recvfrom函數,在數據沒有返回以前,進程阻塞,直到數據返回後,纔會處理數據。網絡

二、非阻塞式IO模型(non-blocking I/O)

非阻塞式IO模型.png 進程調用recvfrom函數,若是數據沒有準備好就返回錯誤提示,以後進程循環調用recvfrom函數,直到有數據返回。異步

三、IO複用模型(I/O multiplexing)

IO複用模型.png 進程調用select,若是沒有套接字變爲可讀,則阻塞,直到有可讀套接字以後,調用recvfrom函數,返回結果。socket

四、信號驅動式IO模型(signal-driven I/O)

信號驅動式IO模型.png 進程先註冊信號驅動,以後進程不阻塞,當數據準備好後,會給進程返回信號提示,這時進程調用ecvfrom函數,返回數據。async

五、異步IO模型(asynchronous I/O)

異步IO模型.png 由POSIX規範定義,應用程序告知內核啓動某個操做,並讓內核在整個操做(包括將數據從內核拷貝到應用程序的緩衝區)完成後通知應用程序。這種模型與信號驅動模型的主要區別在於:信號驅動I/O是由內核通知應用程序什麼時候啓動一個I/O操做,而異步I/O模型是由內核通知應用程序I/O操做什麼時候完成。函數

IO模型對比

5種IO模型比較.png 阻塞越少,理論上性能也越優。性能

  • 阻塞式IO,每一個鏈接要對應一個線程單獨處理,浪費資源。
  • 非阻塞式IO,須要不斷的輪詢,也耗費CPU資源。
  • 信號驅動式IO,在大量IO操做時會有信號隊列溢出,且對於TCP而言,通知條件過多,每個進行判斷會消耗資源。
  • 異步IO,理論最優,可是目前Linux支持還不是很完善。

所以在Linux下網絡編程都以IO複用模型爲主。學習

參考

理解高性能網絡模型 IO - 同步,異步,阻塞,非阻塞 (亡羊補牢篇).net

tencent.jpg

相關文章
相關標籤/搜索