1. 程式人生 > 程式設計 >深入瞭解Netty【四】IO模型

深入瞭解Netty【四】IO模型


引言

IO模型就是操作資料輸入輸出的方式,在Linux系統中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO複用模型、訊號驅動式IO模型、非同步IO模型。 因為學習Netty必不可少的要了解IO多路複用模型,本篇是基礎。

名詞概念

  • 阻塞:指向呼叫方,在呼叫結果返回之前,呼叫方執行緒會掛起,直到結果返回。
  • 非阻塞:指向呼叫方,在呼叫結果返回之前,呼叫方執行緒會處理其他事情,不會阻塞。
  • 同步:指向被呼叫方,被呼叫方得到結果後再返回給呼叫方。
  • 非同步:指向被呼叫方,被呼叫方先應答呼叫方,然後計算結果,最終通知並返回給呼叫方。
  • recvfrom函式:系統呼叫,經socket接收資料。

5中IO模型

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

阻塞式IO模型.png 程式呼叫recvfrom函式,在資料沒有返回之前,程式阻塞,直到資料返回後,才會處理資料。

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

非阻塞式IO模型.png 程式呼叫recvfrom函式,如果資料沒有準備好就返回錯誤提示,之後程式迴圈呼叫recvfrom函式,直到有資料返回。

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

IO複用模型.png 程式呼叫select,如果沒有套接字變為可讀,則阻塞,直到有可讀套接字之後,呼叫recvfrom函式,返回結果。

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

訊號驅動式IO模型.png 程式先註冊訊號驅動,之後程式不阻塞,當資料準備好後,會給程式返回訊號提示,這時程式呼叫ecvfrom函式,返回資料。

5、非同步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 - 同步,非同步,阻塞,非阻塞 (亡羊補牢篇)

tencent.jpg