深入瞭解Netty【四】IO模型
阿新 • • 發佈:2020-06-24
引言
IO模型就是操作資料輸入輸出的方式,在Linux系統中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO複用模型、訊號驅動式IO模型、非同步IO模型。 因為學習Netty必不可少的要了解IO多路複用模型,本篇是基礎。
名詞概念
- 阻塞:指向呼叫方,在呼叫結果返回之前,呼叫方執行緒會掛起,直到結果返回。
- 非阻塞:指向呼叫方,在呼叫結果返回之前,呼叫方執行緒會處理其他事情,不會阻塞。
- 同步:指向被呼叫方,被呼叫方得到結果後再返回給呼叫方。
- 非同步:指向被呼叫方,被呼叫方先應答呼叫方,然後計算結果,最終通知並返回給呼叫方。
- recvfrom函式:系統呼叫,經socket接收資料。
5中IO模型
1、阻塞式IO模型(blocking I/O)
程式呼叫recvfrom函式,在資料沒有返回之前,程式阻塞,直到資料返回後,才會處理資料。
2、非阻塞式IO模型(non-blocking I/O)
程式呼叫recvfrom函式,如果資料沒有準備好就返回錯誤提示,之後程式迴圈呼叫recvfrom函式,直到有資料返回。
3、IO複用模型(I/O multiplexing)
程式呼叫select,如果沒有套接字變為可讀,則阻塞,直到有可讀套接字之後,呼叫recvfrom函式,返回結果。
4、訊號驅動式IO模型(signal-driven I/O)
程式先註冊訊號驅動,之後程式不阻塞,當資料準備好後,會給程式返回訊號提示,這時程式呼叫ecvfrom函式,返回資料。
5、非同步IO模型(asynchronous I/O)
由POSIX規範定義,應用程式告知核心啟動某個操作,並讓核心在整個操作(包括將資料從核心拷貝到應用程式的緩衝區)完成後通知應用程式。這種模型與訊號驅動模型的主要區別在於:訊號驅動I/O是由核心通知應用程式何時啟動一個I/O操作,而非同步I/O模型是由核心通知應用程式I/O操作何時完成。
IO模型對比
阻塞越少,理論上效能也越優。
- 阻塞式IO,每個連線要對應一個執行緒單獨處理,浪費資源。
- 非阻塞式IO,需要不斷的輪詢,也耗費CPU資源。
- 訊號驅動式IO,在大量IO操作時會有訊號佇列溢位,且對於TCP而言,通知條件過多,每一個進行判斷會消耗資源。
- 非同步IO,理論最優,但是目前Linux支援還不是很完善。
因此在Linux下網路程式設計都以IO複用模型為主。