1. 程式人生 > >Netty權威指南_札記01_I/O演進之路

Netty權威指南_札記01_I/O演進之路

文章目錄


1. Linux網路I/O模型

1.1 阻塞 I/O 模型

最常用的I/O模型,預設情況下,所有的檔案操作都是阻塞的。
以套接字介面為例:在程序空間中呼叫recvfrom,其系統呼叫知道資料包到達且被複用到應用程序的緩衝區中或者發生錯誤時才返回,在此期間一直會等待,程序在從呼叫recvfrom開始到返回的整段時間內都是被阻塞的。

1.2 非阻塞 I/O 模型

recvfrom從應用層到核心的時候,如果該緩衝區沒有資料的話,就直接返回一個EWOULDBLOCK

錯誤,一般都對非阻塞I/O進行輪詢檢查這個狀態,看核心是不是有資料到來。

1.3 I/O 複用模型

Linux提供select/poll,程序通過將一個或多個fd(file descriptor,檔案描述符)傳遞給select或poll系統呼叫,阻塞在select操作上,這樣select/poll可以幫我們偵測多個fd是否處於就緒狀態。select/poll是順序掃描fd是否就緒,而且支援的fd數量有限,因此它的使用受到一些制約。Linux還提供了一個epoll系統呼叫,epoll使用基於事件驅動方式代替順序掃描,因此效能更高。當有fd就緒時,立刻回撥rollback。

1.4 訊號驅動 I/O 模型

首先開啟套介面訊號驅動I/O功能,並通過系統呼叫sigaction執行一個訊號處理函式(此係統呼叫立即返回,程序繼續工作,是非阻塞的)。當資料準備就緒時,就為該程序生成一個SIGIO訊號,通過訊號回撥通知應用程式呼叫recvfrom來讀取資料,並通知主迴圈函式處理資料。

1.5 非同步 I/O

告知核心啟動某個操作,並讓核心在整個操作完成後(包括將資料從核心複製到自己的緩衝區)通知我們。
與訊號驅動模型的主要區別:訊號驅動I/O由核心通知我們合適可以開始一個I/O操作;非同步I/O模型有核心通知我們I/O操作何時已經完成。

2. I/O多路複用技術

目前支援I/O多路複用的系統呼叫有selectpselectpollepoll

3. 為了克服select的缺點,epoll作了很多重大改進,總結如下:

3.1 支援一個程序開啟的socket描述符(FD)不受限制(僅受限於作業系統的最大檔案控制代碼數)

3.2 I/O效率不會隨著FD數目的增加而線性下降

3.3 shiyong mmap加速核心與使用者空間的訊息傳遞

3.4 epoll的API更加簡單