1. 程式人生 > >Java BIO與NIO的比較

Java BIO與NIO的比較

前提:相對於傳統IO,NIO將磁碟->核心空間緩衝區->使用者空間緩衝區變為 

                                            磁碟->使用者空間緩衝區  ,減少了中間的拷貝過程。

BIO讀取過程:

讀取過程(共三次複製拷貝過程):

1 jvm堆執行fileInputStream.read()請求作業系統,然後作業系統請求磁碟。

2 從磁碟中讀取到資料,然後寫到作業系統緩衝區中。

3 將資料從作業系統緩衝區放到jvm程序緩衝區(按位元組流讀取,即一個一個位元組byte讀取資料)。

4 jvm將jvm程序中緩衝區東西拷貝到jvm堆記憶體中(應用部署位置)。

NIO讀取過程:

與BIO的區別有如下兩點:

1 相對於bio的一個一個byte傳,nio是以channel形式讀取buffer緩衝區,然後以塊資料傳輸

2 nio減少了複製過程(這裡共兩種方法)

第一種:jvm程序的虛擬地址空間直接從磁碟中讀取。

直接把磁碟對映到JVM程序的虛擬地址空間,放置對應到頁表上。

上圖可見BIO中2,3,4複製過程都沒有了,變成如下:

-- 1 jvm堆執行fileInputStream.read()請求作業系統,然後作業系統請求磁碟。

-- 2 直接從磁碟對映到jvm程序的虛擬地址空間。

第二種:直接記憶體(堆外記憶體 DirectBuffer),刪掉了BIO第4步的複製。

3 採取多路複用技術監聽請求

關鍵點如下:

1 只有一個執行緒用於監聽

2 對應通道會註冊感興趣的事件(如讀寫事件)

3 假如通道註冊了讀事件,當通道發現有資料了,作業系統就會通知執行緒這個通道有資料了

4 這樣的話,註冊大量channel,都可以只要一個執行緒監聽,只要事件觸發了,作業系統就會通知該執行緒去處理。

參考文章:

參考自Q群:Java交流討論一群(250431014)-群主的幫助