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