版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-內(nèi)存映像

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

概念

內(nèi)存映像,指的是內(nèi)核在內(nèi)存中如何存放可執(zhí)行程序文件。像使用虛擬內(nèi)存一樣,使用內(nèi)存映像文件同樣需要經(jīng)過(guò)保留和提交兩個(gè)過(guò)程,首先在進(jìn)程內(nèi)存空間保留一塊區(qū)域,然后提交物理存儲(chǔ)給這段區(qū)域(映像)。不同的是物理存儲(chǔ)來(lái)自于磁盤上的文件,而不是系統(tǒng)的分頁(yè)文件。也即將磁盤上指定的數(shù)據(jù)文件作為虛擬內(nèi)存,這個(gè)實(shí)現(xiàn)過(guò)程被稱為文件映像,可以將文件全部或部分映像到進(jìn)程的地址空間中。文件映像過(guò)以后,可以把文件映像的部分當(dāng)作已全部被載入內(nèi)存一樣的去訪問(wèn)它,這時(shí)又稱它為內(nèi)存映像文件。

內(nèi)存文件映射也是Windows的一種內(nèi)存管理方法,提供了一個(gè)統(tǒng)一的內(nèi)存管理特征,使應(yīng)用程序可以通過(guò)內(nèi)存指針對(duì)磁盤上的文件進(jìn)行訪問(wèn),其過(guò)程就如同對(duì)加載了文件的內(nèi)存的訪問(wèn)。通過(guò)文件映射這種使磁盤文件的全部或部分內(nèi)容與進(jìn)程虛擬地址空間的某個(gè)區(qū)域建立映射關(guān)聯(lián)的能力,可以直接對(duì)被映射的文件進(jìn)行訪問(wèn),而不必執(zhí)行文件I/O操作也無(wú)需對(duì)文件內(nèi)容進(jìn)行緩沖處理,所有的文件緩存操作均由系統(tǒng)直接管理,由于取消了將文件數(shù)據(jù)加載到內(nèi)存、數(shù)據(jù)從內(nèi)存到文件的回寫以及釋放內(nèi)存塊等步驟,使得內(nèi)存映射文件在處理大數(shù)據(jù)量的文件時(shí)能起到相當(dāng)重要的作用。

應(yīng)用1. 系統(tǒng)使用內(nèi)存映像文件載入和執(zhí)行.EXE和.DLL文件。一方面節(jié)省了系統(tǒng)分頁(yè)文件空間,另一方面縮短了加載應(yīng)用程序開始執(zhí)行所需的時(shí)間。

2. 使用內(nèi)存映像文件訪問(wèn)磁盤上的數(shù)據(jù)文件。繞開對(duì)文件實(shí)行I/O操作和對(duì)文件內(nèi)容的緩沖,交由操作系統(tǒng)內(nèi)核去完成。

3. 使用內(nèi)存映像文件可以實(shí)現(xiàn)在多個(gè)進(jìn)程間彼此共享數(shù)據(jù)。Windows提供了在進(jìn)程間進(jìn)行數(shù)據(jù)通信的其它多種方法。但這些方法也是通過(guò)內(nèi)存映像文件來(lái)實(shí)現(xiàn)的,所以內(nèi)存映像文件是實(shí)現(xiàn)進(jìn)程間通信最有效率的方法。

可執(zhí)行程序文件和內(nèi)存映像的區(qū)別1、可執(zhí)行程序是位于硬盤上的,而內(nèi)存映像位于內(nèi)存上;

2、 可執(zhí)行程序沒有堆棧,因?yàn)橹挥挟?dāng)程序被加載到內(nèi)存上的時(shí)候才會(huì)分配相應(yīng)的堆棧;

3、 執(zhí)行程序是靜態(tài)的,因?yàn)樗€沒運(yùn)行,但是內(nèi)存映像是動(dòng)態(tài)的,數(shù)據(jù)是隨著運(yùn)行過(guò)程改變的;

內(nèi)存映像布局Linux下的內(nèi)存映像布局一般有如下幾個(gè)段(從低地址到高地址)1:

1) 代碼段: 即二進(jìn)制機(jī)器代碼,代碼段是只讀的,可以被多個(gè)進(jìn)程共享;

2) 數(shù)據(jù)段: 存儲(chǔ)已初始化的變量,包括全局變量和初始化了的靜態(tài)變量;

3) 未初始化數(shù)據(jù)段: 存儲(chǔ)未被初始化的靜態(tài)變量,也就是BSS段;

4)堆: 用于存放動(dòng)態(tài)分配的變量;

5) 棧: 用于函數(shù)調(diào)用,保存函數(shù)返回值,參數(shù)等等;