Netty---高併發IO的底層原理
1.1 核心態和使用者態
為了避免使用者程序直接操作核心,保證核心安全,作業系統將記憶體分為了兩部分:核心空間和使用者空間核心模組執行在核心空間,對應核心態,使用者程式執行在使用者空間,對應使用者態
1.2 系統呼叫
使用者態程序不能直接訪問核心空間的資料,也不能直接呼叫核心函式,因此需要將程序切換到核心才可以進行這個操作這個過程叫系統呼叫
1.3 核心緩衝區與程序緩衝區
使用者程式進行IO的讀寫依賴於底層的IO讀寫,主要是read和wirte兩大原語我們理解的應用程式IO過程:物理裝置(磁碟等)和記憶體的讀寫,實際上這並不是真正的使用者程式的IO
每一次物理裝置和記憶體的資源交換都要經過一次中斷
使用者程式的讀,使用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