Windows的記憶體管理

2021-06-16 14:06:32 字數 2779 閱讀 7417

一位址空間

1. 位址空間

乙個程式最大的定址範圍。對於win32作業系統,最大的定址範圍為2的32次方。

2. 位址空間的劃分

通常情況下

2.1使用者空間 

執行應用程式的**、資料等。

2.1.1 空指標區(null區)

位址範圍 0 - 0x0000ffff

2.1.2 使用者區

位址範圍 0x0001000 - 0x7ffeffff

2.1.3 64k禁入區

位址範圍 0x7ffeffff - 0x7fffffff

2.2  核心空間 

系統使用,執行驅動、核心的資料和**。

二位址對映

1. 記憶體區域

位址的對其方式是以64k為邊界。

區域狀態:

1)保留- 空閒的, 可以被使用

2)私有 - 已經被占有, 但是還未使用

3)映像 - 程式的**使用

4)對映 - 程式的資料使用

2. 物理記憶體

實際可以使用的物理儲存器

3. 虛擬記憶體

使用硬碟空間作為記憶體擴充套件,也可以當做物理記憶體使用。

4. 記憶體頁

作業系統使用記憶體頁的方式管理物理記憶體和虛擬記憶體。

通常情況下,記憶體頁的大小為4k 或者8k。

沒給記憶體頁具有自己的狀態,例如:唯讀,可寫,可執行

5. 頁目表

用於管理記憶體頁的表。

頁目 - 頁表 - 記憶體頁

- 頁表

- 頁表

指標 31 ----22 21--------12 11--------- 0

頁目 頁表 偏移量

6.位址空間的訪問

6.1 位址空間已經存在對映好的物理記憶體,直接使用。

6.2 系統去虛擬記憶體中,查詢對應的記憶體頁。如果未找到,體統返回錯誤。

6.3 系統將虛擬記憶體的記憶體頁切換到物理當中。

6.4 返回實際物理記憶體位址,使用資料。

7. 記憶體的使用

7.1 虛擬記憶體使用(記憶體使用方式)

適合大記憶體分配使用。一般情況下如果分配的記憶體大於1m,應該使用虛擬記憶體分配方式。

7.2 堆記憶體

適合小記憶體分配使用。一般情況下對於小於1m的記憶體分配使用。例如malloc/new。

7.3 堆疊記憶體

系統維護的記憶體區。

三虛擬分配

1. 虛擬記憶體

常用於大記憶體分配,分配速度快,可以根據需要制定分配方式。

2. 虛擬記憶體的使用

2.1 分配記憶體

lpvoid winapi virtualalloc(

_in_opt_  lpvoid lpaddress,//null或者用於提交的記憶體位址

_in_      size_t dwsize,//分配的大小,一般是頁的倍數

_in_      dword flallocationtype,//分配的方式

_in_      dword flprotect//記憶體訪問方式

);

分配的空間小於使用者區間(2g)

2.2 提交記憶體

virtualalloc 使用mem_commit方式

2.3 使用記憶體

2.4 釋放記憶體

virtualfree

void virtual()

3.記憶體資訊

globalmemorystate

三堆記憶體

1. 對記憶體的特點

一般分配小資料記憶體,一般小於1m資料使用堆記憶體分配。

一般程式執行後,會有乙個預設堆,這個堆大小一般為1m。

乙個程式可以有多個堆存在。拖過堆記憶體管理器來管理堆中的記憶體。

記憶體分配速度比virtualalloc慢。

2. 堆記憶體的使用

2.1 建立堆

heapcreate

2.2 分配記憶體

heapalloc

2.3 使用記憶體

2.4 釋放記憶體

heapfree

2.5 釋放堆

heapdestory

3. malloc / heapalloc / virtualalloc

malloc 內部呼叫 heapalloc。

heapalloc 內部呼叫vitrualloc。

malloc分配記憶體:例如有100個位元組。

| 記憶體頭 | 100位元組 |

所有使用malloc分配的記憶體,會使用這個記憶體頭構成乙個雙向鍊錶。

4.堆的資訊

getprocessheap 當前程序預設堆的控制代碼

getprocessheaps 當前程序所有堆的控制代碼

四堆疊記憶體

堆疊都是小資料的使用,系統維護,棧的大小一般在1m左右。

例如,windows下可以使用_alloca函式從棧上分配記憶體。

五記憶體對映檔案

1. 記憶體對映檔案

可以將檔案對映成記憶體,我沒可以像使用記憶體一樣使用檔案。

2. 記憶體對映檔案的使用

2.1 建立或開啟乙個檔案

createfile

2.2 建立乙個記憶體對映檔案

2.3 將記憶體對映檔案對映成記憶體位址

mapviewoffile

2.4 使用記憶體

2.5 解除安裝對映

unmapviewoffile

2.6 關閉記憶體對映檔案

closehandle

2.7 檔案關閉

closehandle

windows記憶體管理

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

Windows 記憶體管理

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

Windows記憶體管理

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