windows記憶體管理

2021-08-15 15:47:22 字數 3786 閱讀 9254

物理記憶體:硬體中真實存在的儲存空間。

轉換操作,將程式中的虛擬位址轉換為硬碟中的真實位址(分頁和分段)。

api:

1.堆管理--獲取、分配:

(1)handle heapcreate(dword floptions,size_t dwinitialsize,size_t dwmaximumsize): 

為當前程序申請乙個新堆 

floptions:輸入引數,建立堆的選項(允許用於**執行、失敗產生異常取代null、不連續訪問)

dwinitialsize:輸入引數,堆的初始化大小,自動進行對齊,為0自動指定為乙個記憶體頁的大小。

dwmaximumsize:輸入引數,堆的最大值,為0時表示可增長的。

建立成功返回建立的堆的控制代碼。

(2)handle getprocessheap(void):

獲取當前程序的乙個堆

成功返回堆的控制代碼,失敗返回null。

(3)dword getprocessheaps(dword numberofheaps,phandle processheaps):

獲取程序中的所有堆

numberofheaps:輸入引數,processheaps能夠儲存的個數。

processheaps:輸出引數,指向用於儲存結果的記憶體塊(handle型別的陣列)。

返回值大於引數1,說明記憶體區域過小;小於引數1,成功;為0,失敗。

(4)lpvoid heapalloc(handle hheap,dword dwflags,size_t dwbytes):

在指定堆上分配記憶體塊

hheap:輸入引數,指定將要分配的堆。

dwflags:輸入引數,記憶體分配標誌(如果錯誤丟擲異常、不連續、內容清零)heap_generate_exception heap_no_serialize heap_zero_memory。

dwbytes:輸入引數,需要分配的記憶體區域大小。

成功返回指向新分配的記憶體的指標,失敗返回null。

(5)lpvoid heaprealloc(handle hheap,dword dwflags,lpvoid lpmem,size_t dwbyte):

重新分配已經分配好的堆記憶體塊的大小

lpmem:輸入引數,原記憶體塊位址。

(6)void getsysteminfo(lpsystem_info lpsysteminfo):

獲取系統資訊,包括oen、記憶體分頁大小、記憶體分配粒度、處理器資訊、記憶體空間最大值最小值

lpsysteminfo:輸出引數,指向system_info結構的指標。

2.堆管理--獲取大小、釋放記憶體、銷毀堆

(1)size_t heapsize(handle hheap,dword dwflags,lpcvoid lpmem):

獲取指定堆大小

hheap:輸入引數,要獲取大小的記憶體塊所在堆的控制代碼。

dwflags:輸入引數,記憶體塊的標誌(heap_no_serialize)。

lpmem:輸入引數,要獲取大小的記憶體塊指標。

成功返回記憶體塊大小,失敗返回-1.

(2)bool heapfree(handle hheap,dword dwflags,lpvoid lpmem):

釋放heapalloc heaprealloc所分配的記憶體。

hheap:輸入引數,記憶體塊所在的堆。

dwflags:輸入引數,記憶體塊標誌(heap_no_serialize)

成功返回true,否則返回false。

(3)bool heapdestroy(handle hheap):

銷毀建立的堆

hheap:輸入引數,要銷毀的堆的控制代碼。

成功返回true,否則返回false。

3.虛擬記憶體分配和釋放

(1)lpvoid virtualalloc(lpvoid lpaddress,size_t dwsize,dword flallocationtype,dword flprotect):

提交或者保留記憶體頁面:空閒到保留/提交 保留到提交

lpaddress:輸入引數,分配的起始位置。申請保留時向最近的乙個分配粒度對齊,提交時向最近的乙個頁面對齊,null時自動決定

dwsize:輸入引數,所需要分配的記憶體區域的大小

flallocationtype:輸入引數,分配的型別。mem_commit:提交 mem_reserve:保留 mem_commit|mem_reserve:空閒到提交

flprotect:輸入引數,記憶體保護屬性

成功時返回分配到的記憶體的實際起始位址,失敗時返回null

(2)bool virtualfree(lpvoid lpaddress,size_t dwsize,dword dwfreetype):

將記憶體狀態從提交到保留 保留到空閒 或者同時進行,用於virtualalloc()的反向工作

lpaddress:輸入引數,需要改變的記憶體區域的起始位址

dwsize:輸入引數,需要改變的記憶體區域的大小,位元組為單位

dwfreetype:輸入引數,為mem_decommit,將記憶體變為保留狀態,dwsize=0時,lpaddress必須為記憶體區域的起始位址(virtualalloc的

返回值),整個區域成為reserved狀態;為mem_release,釋放記憶體,直接變為free狀態,dwsize=0時,lpaddress必須是記憶體區域的起始位址

(virtuallalloc的返回值)。兩個值不能同時使用。

成功true,失敗false。

(3)bool virtualprotect(lpvoid lpaddress,size_t dwsize,dword flnewprotect,dword lpfloldprotect):

lpaddress:輸入引數,虛擬記憶體位址。

dwsize:輸入引數,記憶體大小。

flnewprotect:輸入引數,新的記憶體屬性。

ipfloldprotect:輸出引數,可以為null。

(4)bool virtuallock(virtualunlock)(lpvoid lpaddress,size_t dwsize):

lpaddress:輸入引數,虛擬記憶體位址。

dwsize:輸入引數,記憶體大小。

鎖定記憶體、解鎖記憶體。

(5)virtualquery(lpvoid lpaddress,memory_basic_information mbi,size_t dwsize):

lpaddress:輸入引數,虛擬記憶體位址。

mbi:輸入引數,memory_basic_information結構體,儲存記憶體資訊。

dwsize:輸入引數,記憶體大小。

mbi: state: 0x1000(提交狀態) 0x2000(保留狀態) protect:保護屬性,0x04表示可讀寫,0x00表示處於保留狀態。

4.獲得系統記憶體使用狀態:

bool globalmemorystatu***(lpmemorystatu*** lpbuffer):

lpbuffer:輸出引數,指向memorystatu***結構體,儲存系統資訊

兩種記憶體分配方式比較:

heapalloc基於堆分配記憶體管理,無需考慮頁對齊、頁面狀態、頁面屬性等。堆記憶體管理依賴於虛擬記憶體管理,可以簡單地

視為是對commit狀態的虛擬記憶體進行操作。

virtualalloc基於虛擬記憶體管理,原理是通過改變虛擬記憶體頁面屬性(空閒、保留、提交)來分配記憶體,更為底層。

所以堆管理函式更加靈活,分配簡單,可以分配任意大小的記憶體,不受記憶體頁對齊的影響。

windows記憶體管理

32位平台下,cpu的定址能力為4gb,pc中有些裝置 如顯示卡 都提供自己的裝置記憶體,這部分記憶體會對映到pc的物理記憶體上,也就是讀寫這段物理記憶體位址,其實是在讀寫裝置記憶體位址,而不會讀寫物理記憶體位址。雖然提供了4gb的定址能力,但是實際可能沒有這麼大的物理記憶體,這樣就引入了虛擬記憶體...

Windows 記憶體管理

windows 2000 使用基於分頁機制的虛擬記憶體。每個程序有4gb的虛擬位址空間。基於分頁機制,這4gb位址空間的一些部分被映 物理記憶體,一些部分對映硬碟上的交換檔案,一些部分什麼也沒有對映。程式中使用的都是4gb位址空間中的虛擬位址。而訪問物理記憶體,需要使用實體地址。下面我們看看什麼是實...

Windows記憶體管理

虛擬位址空間 程序可用的虛擬位址範圍稱為該程序的 虛擬位址空間 每個使用者模式程序都有其各自的專用虛擬位址空間。對於 32 位程序,虛擬位址空間通常為 2 gb,範圍從 0x00000000 至 0x7fffffff。那麼什麼又是使用者模式?使用者模式與核心模式 這同樣是cpu的概念。cpu就有這兩...