版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、引言引言Windows的內(nèi)存結(jié)構(gòu)是深入理解Windows操作系統(tǒng)如何運(yùn)作的最關(guān)鍵之所在,通過對內(nèi)存結(jié)構(gòu)的認(rèn)識可清楚地了解諸如進(jìn)程間數(shù)據(jù)的共享、對內(nèi)存進(jìn)行有效的管理等問題,從而能夠在程序設(shè)計(jì)時(shí)使程序以更加有效的方式運(yùn)行。Windows操作系統(tǒng)對內(nèi)存的管理可采取多種不同的方式,其中虛擬內(nèi)存的管理方式可用來管理大型的對象和結(jié)構(gòu)數(shù)組。在Windows系統(tǒng)中,任何一個(gè)進(jìn)程都被賦予其自己的虛擬地址空間,該虛擬地址空間覆蓋了一個(gè)相當(dāng)大的范圍,對于32
2、位進(jìn)程,其地址空間為232=4294967296Byte,這使得一個(gè)指針可以使用從0x00000000到0xFFFFFFFF的4GB范圍之內(nèi)的任何一個(gè)值。雖然每一個(gè)32位進(jìn)程可使用4GB的地址空間,但并不意味著每一個(gè)進(jìn)程實(shí)際擁有4GB的物理地址空間,該地址空間僅僅是一個(gè)虛擬地址空間,此虛擬地址空間只是內(nèi)存地址的一個(gè)范圍。進(jìn)程實(shí)際可以得到的物理內(nèi)存要遠(yuǎn)小于其虛擬地址空間。進(jìn)程的虛擬地址空間是為每個(gè)進(jìn)程所私有的,在進(jìn)程內(nèi)運(yùn)行的線程對內(nèi)存空間
3、的訪問都被限制在調(diào)用進(jìn)程之內(nèi),而不能訪問屬于其他進(jìn)程的內(nèi)存空間。這樣,在不同的進(jìn)程中可以使用相同地址的指針來指向?qū)儆诟髯哉{(diào)用進(jìn)程的內(nèi)容而不會由此引起混亂。下面分別對虛擬內(nèi)存的各具體技術(shù)進(jìn)行介紹。地址空間中區(qū)域的保留與釋放地址空間中區(qū)域的保留與釋放在進(jìn)程創(chuàng)建之初并被賦予地址空間時(shí),其虛擬地址空間尚未分配,處于空閑狀態(tài)。這時(shí)地址空間內(nèi)的內(nèi)存是不能使用的,必須首先通過VirtualAlloc()函數(shù)來分配其內(nèi)的各個(gè)區(qū)域,對其進(jìn)行保留。Virt
4、ualAlloc()函數(shù)原型為:LPVOIDVirtualAlloc(LPVOIDlpAddressDWDdwSizeDWDflAllocationTypeDWDflProtect)其參數(shù)lpAddress包含一個(gè)內(nèi)存地址,用于定義待分配區(qū)域的首地址。通??蓪⒋藚?shù)設(shè)置為NULL,由系統(tǒng)通過搜索地址空間來決定滿足條件的未保留地址空間。這時(shí)系統(tǒng)可從地址空間的任意位置處開始保留一個(gè)區(qū)域,而且還可以通過向參數(shù)flAllocationType設(shè)
5、置MEM_TOP_DOWN標(biāo)志來指明在盡可能高的地址上分配內(nèi)存。如果不希望由系統(tǒng)自動完成對內(nèi)存區(qū)域的分配而為lpAddress設(shè)定了內(nèi)存地址(必須確保其始終位于進(jìn)程的用戶模式分區(qū)中,否則將會導(dǎo)致分配的失?。?,那么系統(tǒng)將在進(jìn)行分配之前首先檢查在該內(nèi)存地址上是否存在足夠大的未保留空間,如果存在一個(gè)足夠大的空閑區(qū)域,那么系統(tǒng)將會保留此區(qū)域并返回此保留區(qū)域的虛擬地址,否則將導(dǎo)致分配的失敗而返回NULL。這里需要特別指出的是,在指定lpAddre
6、ss的內(nèi)存地址時(shí),必須確保是從一個(gè)分配粒度的邊界處開始。一般來說,在不同的CPU平臺下分配粒度各不相同,但目前所有Windows環(huán)境下的CPU如x86、32位Alpha、64位Alpha以及IA64等均是采用64KB的分配粒度。如果保留區(qū)域的起始地址沒有遵循從64KB分配粒度的邊界開始之一原則,系統(tǒng)將自動調(diào)整該地址到最接近的64K的倍數(shù)。例如,如果指定的lpAddress為0x00781022,那么此保留區(qū)域?qū)嶋H是從0x00780000
7、開始分配的。參數(shù)dwSize指定了保留區(qū)域的大小。但是系統(tǒng)實(shí)際保留的區(qū)域大小必須是CPU頁面大小的整數(shù)倍,如果指定的dwSize并非CPU頁面的整數(shù)倍,系統(tǒng)將自動對其進(jìn)行調(diào)整,使其達(dá)到與之最接近的頁面大小整數(shù)倍。與分配粒度一樣,對于不同的CPU平臺其頁面大小也是不一樣的。在x86平臺下,頁面大小為4KB,在可以訪問區(qū)域中的內(nèi)存地址。在提交過程中,物理存儲器是按頁面邊界和頁面大小的塊來進(jìn)行提交的。若要為一個(gè)已保留的地址空間區(qū)域提交物理存儲
8、器,需要再次調(diào)用VirtualAlloc()函數(shù),所不同的是在執(zhí)行物理存儲器的提交過程中需要指定flAllocationType參數(shù)為MEM_COMMIT標(biāo)志,使用的保護(hù)屬性與保留區(qū)域時(shí)所用保護(hù)屬性一致。在提交時(shí),可以將物理存儲器提交給整個(gè)保留區(qū)域,也可以進(jìn)行部分提交,由VirtualAlloc()函數(shù)的lpAddress參數(shù)和dwSize參數(shù)指明要將物理存儲器提交到何處以及要提交多少物理存儲器。與保留區(qū)域的釋放類似,當(dāng)不再需要訪問保留
9、區(qū)域中被提交的物理存儲器時(shí),提交的物理存儲器應(yīng)得到及時(shí)的釋放。該回收過程與保留區(qū)域的釋放一樣也是通過VirtualFree()函數(shù)來完成的。在調(diào)用時(shí)為VirtualFree()的dwFreeType參數(shù)指定MEM_DECOMMIT標(biāo)志,并在參數(shù)lpAddress和dwSize中傳遞用來標(biāo)識要解除的第一個(gè)頁面的內(nèi)存地址和要釋放的字節(jié)數(shù)。此回收過程同樣也是以頁面為單位來進(jìn)行的,將回收設(shè)定范圍所涉及到的所有頁面。下面這段代碼演示了對先前保留區(qū)
10、域的提交過程,并在使用完畢后將其回收:在地址空間中保留一個(gè)區(qū)域LPBYTEbBuffer=(LPBYTE)VirtualAlloc(NULL65536MEM_RESERVEPAGE_READWRITE)提交物理存儲器VirtualAlloc(bBuffer65536MEM_COMMITPAGE_READWRITE)……回收提交的物理存儲器VirtualFree(bBuffer65536MEM_DECOMMIT)釋放已保留的區(qū)域Virtu
11、alFree(bBuffer0MEM_RELEASE)由于未經(jīng)提交的保留區(qū)域?qū)嶋H是無法使用的,因此在編程過程中允許通過一次VirtualAlloc()調(diào)用而完成對地址空間的區(qū)域保留及對保留區(qū)域的物理存儲器的提交。相應(yīng)的,回收、釋放過程也可由一次VirtualFree()調(diào)用來實(shí)現(xiàn)。上述代碼可按此方法改寫為:在地址空間中保留一個(gè)區(qū)域并提交物理存儲器LPBYTEbBuffer=(LPBYTE)VirtualAlloc(NULL65536ME
12、M_RESERVE|MEM_COMMITPAGE_READWRITE)……釋放已保留的區(qū)域并回收提交的物理存儲器VirtualFree(bBuffer0MEM_RELEASE|MEM_DECOMMIT)頁文件的使用頁文件的使用在前面曾多次提到物理存儲器,這里所說的物理存儲器并不局限于計(jì)算機(jī)內(nèi)存,還包括在磁盤空間上創(chuàng)建的頁文件,其存儲空間大小為計(jì)算機(jī)內(nèi)存和頁文件存儲容量之和。由于通常情況下磁盤存儲空間要遠(yuǎn)大于內(nèi)存的存儲空間,因此頁文件的使
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 虛擬內(nèi)存
- 虛擬內(nèi)存及優(yōu)化方法
- 設(shè)置虛擬內(nèi)存
- 虛擬內(nèi)存37546
- 虛擬內(nèi)存37641
- 更改虛擬內(nèi)存
- 虛擬內(nèi)存技巧
- 虛擬內(nèi)存解析
- 電腦虛擬內(nèi)存
- 虛擬內(nèi)存37441
- 虛擬內(nèi)存37700
- 虛擬內(nèi)存step
- 正確使用ramdisk來虛擬內(nèi)存硬盤
- 虛擬內(nèi)存教程
- 虛擬內(nèi)存37437
- 虛擬內(nèi)存36476
- 虛擬內(nèi)存37569
- 虛擬內(nèi)存的標(biāo)準(zhǔn)設(shè)置方法
- 虛擬內(nèi)存太低
- 虛擬內(nèi)存37457
評論
0/150
提交評論