1. 程式人生 > >程序地址空間和記憶體檔案對映

程序地址空間和記憶體檔案對映

程序地址空間

每個程序都有自己的地址空間。對32位程序來說,由於32位指標可以表示從0x00000000到0xFFFFFFFF之間的任一值,地址空間的大小為4GB。對64位程序來說,由於64位指標可以表示從0x00000000'00000000到0xFFFFFFFF'FFFFFFFF之間的任一值, 地址空間大小為16GB。

其實這個地址空間是不存在的,也就是我們所說的程序虛擬記憶體空間

linux作業系統每個程序的地址空間都是獨立的,其實這裡的獨立說得是物理空間上得獨立。那相同的虛擬地址,不同的實體地址,他們之間是怎樣聯絡起來的呢?當一個程式被執行時,該程式的內容必須被放到程序的虛擬地址空間,對於可執行程式的共享庫也是如此。可執行程式並非真正讀到實體記憶體中,而只是連結到程序的虛擬記憶體中。

在程序建立的過程中,程式內容被對映到程序的虛擬記憶體空間,為了讓一個很大的程式在有限的實體記憶體空間執行,我們可以把這個程式的開始部分先載入到實體記憶體空間執行,因為作業系統處理的是程序的虛擬地址,如果在進行虛擬到實體地址的轉換工程中,發現物理地址不存在時,這個時候就會發生缺頁異常(nopage),接著作業系統就會把磁碟上還沒有載入到記憶體中的資料載入到實體記憶體中,對應的程序頁表進行更新。也許你會問,如果此時實體記憶體滿了,作業系統將如何處理?

當實體記憶體溢位時,linux使用"最近最少使用(LeastRecently Used ,LRU)"(很多快取技術都是這個原則)頁面排程技巧來公平地選擇哪個頁可以從系統中刪除。

記憶體對映檔案

記憶體對映檔案是由一個檔案到程序地址空間的對映,而不是真正意義上的對映記憶體。通過檔案對映這種使磁碟檔案的全部或部分內容與程序地址空間的某個區域建立對映關聯的能力,可以直接對被對映的檔案進行訪問,而不必執行檔案I/O操作也無需對檔案內容進行緩衝處理。。記憶體檔案對映的這種特性是非常適合於用來管理大尺寸檔案的。

使用記憶體對映檔案的一般流程

如果有十幾GB乃至幾十GB容量的巨型檔案,顯然不能一次將檔案映像全部對映進來。對於這種情況只能依次將大檔案的各個部分對映到程序中的一個較小的地址空間。這需要對上面的一般流程進行適當的更改:

1)對映檔案開頭的映像。

2)對該映像進行訪問。

3)取消此映像

4)對映一個從檔案中的一個更深的位移開始的新映像。

5)重複步驟2,直到訪問完全部的檔案資料。