1. 程式人生 > 其它 >Netty---高併發IO的底層原理

Netty---高併發IO的底層原理

一.IO讀寫的基本原理

1.1 核心態和使用者態

為了避免使用者程序直接操作核心,保證核心安全,作業系統將記憶體分為了兩部分:核心空間和使用者空間核心模組執行在核心空間,對應核心態,使用者程式執行在使用者空間,對應使用者態

1.2 系統呼叫

使用者態程序不能直接訪問核心空間的資料,也不能直接呼叫核心函式,因此需要將程序切換到核心才可以進行這個操作這個過程叫系統呼叫

1.3 核心緩衝區與程序緩衝區

使用者程式進行IO的讀寫依賴於底層的IO讀寫,主要是read和wirte兩大原語我們理解的應用程式IO過程:物理裝置(磁碟等)和記憶體的讀寫,實際上這並不是真正的使用者程式的IO

每一次物理裝置和記憶體的資源交換都要經過一次中斷

這種操作是由作業系統系統核心(Kernel)完成的,與我們無關系統中斷是一次非常消耗系統資源的過程,大致過程為:發生中斷時,需要儲存程序的一系列資訊(比如PCB),結束中斷要恢復一系列資訊頻繁的中斷會極大的影響作業系統的效能,所以出現了核心緩衝區程序緩衝區的概念記憶體當中有一個核心緩衝區,每個程序對應一個程序緩衝區

使用者程式的讀,使用read函式,將核心緩衝區的資料複製到程序緩衝區使用者程式的寫,使用wirte函式,將程序緩衝區的資料複製到記憶體緩衝區

所以,真正的使用者程式的IO並沒有記憶體和物理裝置之間資源的交換,而是程序緩衝區和記憶體緩衝區的複製

二.四大IO模型

2.1 阻塞與非阻塞

阻塞IO:執行read和wirte函式必須到核心態,只有核心IO完成後才能返回到使用者態執行使用者程式的操作指令非阻塞IO:使用者空間的程式不需要等待核心IO操作徹底完成,可以立即返回使用者空間去執行使用者程式的後續指令,並且核心IO會返回一個當前IO的狀態值在java中預設建立的socket都屬於阻塞IO

2.2 同步與非同步

同步IO:使用者空間(程序或者執行緒)是主動發起IO請求的一方,系統核心被動接受非同步IO:系統核心主動發起IO請求,使用者空間被動接受

2.3 同步阻塞式IO (BIO)

預設情況下,在java應用程式程序中所有對 socket 連線進行的IO