深入理解虛擬記憶體管理

2021-04-23 22:37:44 字數 2804 閱讀 5154

訪問虛擬記憶體時的處理流程

一張流程圖,看明白了,一切ok。

虛擬位址到實體地址的轉換

win32

中的「指標」意味著虛擬位址。將

32位氛圍

10位、

10位、

12位,第乙個

10位用來定位頁目錄中的頁目錄項,左移兩位,此頁目錄項指向乙個頁表;第二個

10位定位也表中的頁表項,指向真正的物理記憶體;最後

12位定位頁內資料(乙個頁面

4kb)。

頁表項中有一位用來標識包含此資料的頁是否在物理記憶體頁中,如果不在,拋出缺頁錯誤;頁表項中還可檢查此資料是否在調頁檔案中,如果不在,則訪問違例。

虛擬記憶體空間使用狀態記錄

每個程序有乙個自己的

vad集合,只有預留或者提交的記憶體塊才會有

vad,自由的記憶體塊沒有

vad。詳細的記憶體訪問、申請過程以及在此期間

vad發揮的作用,檢視請參考文獻

[1]第4章。

程序工作集

關鍵字:

locality

特性[1]

對每乙個程序,虛擬記憶體管理器都會將其一定量的記憶體頁駐留在物理記憶體中,並跟蹤其執行的效能指標,動態調整這個數量。

win32

駐留在物理記憶體中的記憶體頁稱為程序的「工作集」(

working set

),通過任務管理器檢視,「記憶體使用」列即為工作集大小。

系統為每個程序定義了乙個預設的最小值(根據系統物理記憶體大小

20~50mb

)和最大值(

45~345mb

)。當工作集到達最大值時,程序需要調入新頁時,虛擬記憶體管理器就會將原來工作集中的某些頁置換出。

虛擬記憶體管理器在調頁時,不僅僅只是調入需要的頁,同時還將其附近的頁也一起調入記憶體。所以: 1

,對於**來說,盡量編寫緊湊**,最理想的情形就是工作集從不會達到最大閾值。 2

,對於資料來說,盡量將那些會一起訪問的資料(比如鍊錶)放在一起。利用

win32

提供的預留和提交兩步機制,可以為這些會一同訪問的資料預留出一大塊空間。記憶體池也是基於類似的考慮。

win32

記憶體相關

api

1,傳統的

crt函式(

malloc/free

系列):平台無關,方便移植,是它們最受歡迎的特性。 2

,global heap/local heap

函式(globalalloc/localalloc

系列)

這組函式是為了向後相容而保留的。在

windows3.1

平台下,

global heap

為系統中所有程序共有的堆,這些程序包括系統程序和使用者程序。它們對此

global heap

記憶體的申請會交錯在一起,從而使得乙個使用者程序不小心的記憶體使用錯誤會導致整個作業系統的崩潰。

local heap

又被稱為「

private heap

」,為每個程序私有。此外,程序不能通過另外的使用者自定義堆或者其他方式動態地申請記憶體。 到了

win32

平台,考慮安全因素,

global heap

被廢棄,

local heap

改名為process heap

。globalalloc/localalloc

函式雖被沿用,但是它們都是從

process heap

中分配記憶體。

win32

平台還允許程序除

process heap

之外生成和使用新的使用者自定義堆,因此在

win32

下建議不適用

globalalloc/localalloc

函式進行記憶體操作。 3

,虛擬記憶體函式(

virtualalloc/virtualfree

系列)

這組函式直接通過保留和提交虛擬記憶體位址空間來操作記憶體,因此它們為開發人員提供最大的自由度,但相應地為開發人員記憶體管理增加了更多的負擔。這組函式適合於為大型連續的資料結構陣列開闢空間。

4,記憶體對映檔案(

系列)

系統使用記憶體對映檔案函式系列來載入

.exe

或者.dll

檔案。而對開發人員而言,一方面通過這組函式可以方便地操作硬碟檔案,而不用考慮那些繁瑣的檔案

io操作;另一方面,執行在同一臺機器上的多個程序可以通過記憶體對映檔案來共享資料(這也是同一臺機器上程序間進行資料共享和通訊的最有效率和最方便的方法

[2])。

5,堆記憶體函式(

heapcreate/heapalloc

系列)

win32

平台中的每個堆都是各程序私有的,每個程序除了預設的程序堆,還可以另外建立使用者自定義堆。當程式需要動態建立多個小資料結構時,堆函式系列最為合適。一般來說,

crt函式(

malloc/free

)就是基於堆函式實現的。

參考文獻:

[1] c++

應用程式效能優化

馮巨集華徐瑩

程遠汪磊

等編著

[2] windows

核心程式設計

c++應用程式效能優化.

[1]以前執行的**和訪問的資料在後面有很大可能會被再次執行或訪問。

[2]作者敢這麼說,真是佩服他。另外,在此衷心感謝作者指明各個函式的「用途」,相信作者一定是乙個在實際開發工作中有深刻體會的研究者。

深入理解虛擬記憶體管理

訪問虛擬記憶體時的處理流程 一張流程圖,看明白了,一切ok。虛擬位址到實體地址的轉換 win32 中的 指標 意味著虛擬位址。將 32位氛圍 10位 10位 12位,第乙個 10位用來定位頁目錄中的頁目錄項,左移兩位,此頁目錄項指向乙個頁表 第二個 10位定位也表中的頁表項,指向真正的物理記憶體 最...

深入理解記憶體 3 記憶體交換技術,虛擬記憶體

2013 01 15 21 14 1560人閱讀收藏 舉報 3 c 59 1 it related 21 目錄 頁式儲存管理 段式儲存管理 分頁與分段結合 虛擬記憶體 我們知道當多程序在記憶體中共存時,如果記憶體足夠大都夠用,大家相安無事自然是最理想的事了.不過現實往往沒那麼美好.有些時候記憶體會滿...

理解虛擬記憶體

參考 理解虛擬記憶體 linux之旅 關於虛擬記憶體 linux中關於swap 虛擬記憶體和page的區別 在解釋第乙個問題之前,先說明一下計算機記憶體管理的中的四個名詞 虛擬記憶體,虛擬記憶體位址,物理記憶體,物理記憶體位址。先說說為什麼會有虛 擬記憶體和物理記憶體的區別。正在執行的乙個程序,他所...