(轉)虛擬內存與內存映射文件區別與聯系
虛擬內存與內存映射文件是操作系統內存管理的重要部分,二者有相似也有不同的地方,本文是作者學習與應用中得到的一些體會,有錯誤的地方,請提點。
二者的聯系:虛擬內存與內存映射文件都是將一部分內容加載的內存,另一部分放在磁盤(硬盤)上的一種機制。二者都是應用程序動態性的基礎。由於二者的虛擬性,對於應用而言,都是透明的。
學過操作系統的都知道虛擬內存其實就是磁盤的一部分,是計算機RAM與硬盤的數據交換區。因為實際的物理內存可能遠小於進程的地址空間,這就需要把內存中暫時不用到的數據放到硬盤上一個特殊的地方,當請求的數據不在內存中時,系統產生卻頁中斷,內存管理器便將對應的內存頁重新從硬盤調入物理內存。在Windows系統,硬盤中這部分空間是一個文件,即系統目錄下的pagefile文件。
內存映射文件是由一個文件到一塊內存的映射,使應用程序可以通過內存指針對磁盤上的文件進行訪問,其過程就如同對加載了文件的內存的訪問,因此內存文件映射非常適合於用來管理大文件。
虛擬內存實現的硬件基礎是分頁機制,關於分頁機制本文再此不做介紹。虛擬內存實現的另外一個重要基礎是局部性原理。局部性是指程序總是趨向於使用最近使用過的數據和指令,也就是說程序執行時所訪問的存儲器地址分布是相對集中的。局部性原理是應用虛擬內存提升性能的主要原因,也是虛擬內存卻別與內存映射文件的本質。內存映射文件虛擬性並不是由於局部性,而是使進程虛擬地址空間的某個區域建立映射磁盤文件的全部或部分內容,通過該區域可以直接對被映射的磁盤文件進行訪問,而不必執行文件I/O操作也無需對文件內容進行緩沖處理。
另外,虛擬內存使用硬盤只能是頁面文件,而內存映射使用的磁盤部分可以是任何磁盤文件。
最後,二者的架構不同,或者說是應用出發點不同。虛擬內存是架構在物理內存之上,其引入是因為實際的物理內存運行程序所需的空間,即使現在計算機中的物理內存越來越大,程序的尺寸也在增長。將所有運行著的程序全部加載到內存中不經濟也非常不現實。內存映射文件架構在程序的地址空間之上,在Win32中,地址空間只有4G,而某些大文件的尺寸可要要遠超出這個值,因此,用地址空間中的某段應用文件中的一部分可解決處理大文件的問題,在Win32中,使用內存映射文件可以處理2的64次(64EB)大小的文件.原因內存映射文件,除了處理大文件,還可用作進程間通信,在此不做詳解。
轉自:http://blog.sina.com.cn/s/blog_4eee98350100abbr.html
(轉)虛擬內存與內存映射文件區別與聯系