NIO與傳統I/O之間I/O的區別
要想講清楚nio的原理和它的優點得先清楚Java應用程式的檔案讀寫原理和虛擬記憶體的原理。Java檔案讀取原理可參見如下圖:
當應用程式需要讀取檔案的時候,核心首先通過DMA技術將檔案內容從磁碟讀入核心中的buffer,然後Java應用程序再從核心的buffer將資料讀取到應用程式的buffer。
為了提升I/O效率和處理能力,作業系統採用虛擬記憶體的機制。虛擬記憶體也就是我們常說的交換記憶體,它實際上是硬碟上的檔案,虛擬記憶體有兩個作用:
1. 不同的虛擬記憶體可以對映到相同的實體記憶體,根據這個原理,可以簡化檔案讀取流程,提升讀取效率,效果如下圖所示:
通過使用虛擬記憶體技術,將應用程式的buffer和核心的buffer都作為虛擬記憶體,並且兩塊不同的虛擬記憶體指向相同的實體記憶體
2. 通過使用虛擬記憶體, 應用程式可以使用比實體記憶體所能容納得大得多的記憶體,並且也能夠提高I/O效率。當實體記憶體中的資料不使用的時候,可以將實體記憶體中的資料放到虛擬記憶體中,作業系統就可以騰出實體記憶體空間儲存新的要處理的資料。當需要使用虛擬記憶體中的資料時,再可以把虛擬記憶體中的資料載入到實體記憶體中。因此實體記憶體可以看做時虛擬記憶體中存放資料的cache。而上面所述的cache虛擬記憶體資料的過程,對應用程式來說時透明的,它可以像處理實體記憶體資料一樣處理虛擬記憶體中的資料。
Java nio通過使用虛擬記憶體技術將檔案系統中的檔案頁和應用程式空間直接對應起來,使用nio後,檔案的讀寫操作都是在虛擬記憶體中實現。這樣在操作檔案的時候,好像檔案已經在記憶體中一樣。採用了虛擬記憶體技術,使用Java nio方式可以很快的讀取很大的檔案。
通過把核心空間和使用者空間的虛擬的地址對映到同一塊實體地址,這樣DMA硬體可以填充對核心空間和使用者空間同時可見的緩衝區。