進(jìn)程的虛擬地址空間
對(duì)于32位進(jìn)程來說,這個(gè)地址空間的大小為4GB。每個(gè)進(jìn)程都有自己專有的地址空間,當(dāng)進(jìn)程中的各線程運(yùn)行時(shí),它們只能訪問屬于該進(jìn)程的內(nèi)存。線程既看不到屬于其他進(jìn)程的內(nèi)存,也無法訪問它們。

虛擬地址空間的分區(qū)
1、空指針賦值分區(qū):進(jìn)程地址空間的0x00000000到0x0000FFFF的閉區(qū)間。
2、用戶模式分區(qū):在x86的CPU中,地址空間為0x00010000到0x7FFEFFFF? ~2GB。所有的exe和DLL都載入到這一區(qū)域。
因此進(jìn)程可用地址空間的數(shù)量還不到進(jìn)程整個(gè)地址空間的一半。
在x86模式下,可以得到更大的用戶模式分區(qū),但最多不能超過3GB。需要對(duì)windows中的啟動(dòng)配置數(shù)據(jù)(BCD)進(jìn)行設(shè)定,并重啟機(jī)器。
3、內(nèi)核模式分區(qū):操作系統(tǒng)代碼的駐地。

頁交換文件,一般是在磁盤上的虛擬內(nèi)存,可供任何進(jìn)程使用。系統(tǒng)中的頁交換文件的大小是決定應(yīng)用程序可用內(nèi)存總量的最重要因素。
硬盤顛簸:指操作系統(tǒng)把所有的時(shí)間都花在頁面文件和內(nèi)存之間交換數(shù)據(jù)上,導(dǎo)致沒有時(shí)間運(yùn)行程序。

Windows提供了三種機(jī)制對(duì)內(nèi)存進(jìn)行操控:
1、虛擬內(nèi)存:最適合用來管理大型對(duì)象數(shù)組或大型數(shù)據(jù)結(jié)構(gòu)
2、內(nèi)存映射文件:最適合用來管理大型數(shù)據(jù)流(通常是文件),以及在同一機(jī)器上運(yùn)行的多個(gè)進(jìn)程之間共享數(shù)據(jù)
3、堆:最適合用來管理大量的小型對(duì)象
本文章主要討論第一種方式。
一、預(yù)訂地址空間區(qū)域
這個(gè)操作主要是在一個(gè)進(jìn)程能看到的內(nèi)存空間上預(yù)訂地址空間,比如在32位的機(jī)器上,一個(gè)進(jìn)程能看到的內(nèi)存大小是4GB(但其實(shí)能供進(jìn)程用的并沒有那么多)。
調(diào)用VirtualAlloc函數(shù)來預(yù)訂進(jìn)程中的地址空間區(qū)域。
LPVOID WINAPI VirtualAlloc(
__in LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD flAllocationType,
__in DWORD flProtect
);
第一個(gè)參數(shù)lpAddress是內(nèi)存地址,用來告訴系統(tǒng)我們想要預(yù)訂地址空間中的起始地址。如果該參數(shù)為NULL,系統(tǒng)會(huì)自動(dòng)找一塊閑置區(qū)域。但不保證分配方法。
需要注意的是系統(tǒng)始終按照分配粒度(目前在所有Windows平臺(tái)上都為64KB)的整數(shù)倍來分配區(qū)域。
如果系統(tǒng)無法滿足我們的請(qǐng)求,函數(shù)將返回NULL。
第二個(gè)參數(shù)dwSize用來指定我們想要預(yù)訂區(qū)域的大小,以字節(jié)為單位。而系統(tǒng)始終根據(jù)CPU頁面大小的整數(shù)倍來預(yù)訂區(qū)域。在Windows平臺(tái)下一般是4KB。
第三個(gè)參數(shù)flAllocationType用來告訴系統(tǒng)用這個(gè)函數(shù)是要預(yù)訂區(qū)域還是要調(diào)撥物理存儲(chǔ)企。如果要預(yù)訂地址空間區(qū)域,必須傳入MEM_RESERVE參數(shù)。
如果希望讓系統(tǒng)從盡可能高的內(nèi)存地址來預(yù)訂區(qū)域,必須傳NULL給lpAddress,同時(shí)對(duì)MEM_TOP_DOWN標(biāo)志和MEM_RESERVE標(biāo)志進(jìn)行按位或操作,并把結(jié)果作為flAllocationType傳入。
第四個(gè)參數(shù)flProtect是給區(qū)域指定的保護(hù)屬性。這個(gè)屬性對(duì)于調(diào)撥給該區(qū)域的物理存儲(chǔ)器不起任何作用。因?yàn)樵噲D訪問區(qū)域內(nèi)的任何內(nèi)存地址將會(huì)引發(fā)訪問違規(guī)。當(dāng)區(qū)域的保護(hù)屬性和將要調(diào)撥的物理存儲(chǔ)器的保護(hù)屬性一致時(shí),系統(tǒng)內(nèi)部的處理效率會(huì)更高。

二、給區(qū)域調(diào)撥物理存儲(chǔ)器
調(diào)用的函數(shù)還是VirtualAlloc。但第三個(gè)參數(shù)這次改為MEM_COMMIT。IpAddress和dwSize也會(huì)相應(yīng)改為在物理內(nèi)存上的操作。

三、同時(shí)預(yù)訂和調(diào)撥物理存儲(chǔ)器
調(diào)用VirtualAlloc,并將第三個(gè)參數(shù)改為MEM_COMMIT|MEM_RESERVE。