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)-群主的幫助