物理記憶體:硬體中真實存在的儲存空間。
轉換操作,將程式中的虛擬位址轉換為硬碟中的真實位址(分頁和分段)。
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就有這兩...