探索windows虛擬記憶體

來源:互聯網
上載者:User

對於進程地址空間虛擬記憶體的使用,使用者程式必須經過“保留(reserve)”和“提交(commit)”兩個階段才能使用一段位址範圍。“保留一段位址範圍”的用意是,將這段位址範圍保留起來,但並不真正使用,由於這段位址範圍不佔用任何實體記憶體或其他外存空間,所以並不形成實質的開銷。這對於有些需要連續的地址空間的程式有意義,他們可以在初始時保留一大段位址範圍,以後需要的時候陸續使用。“提交位址範圍”是指這段地址終究要消耗實體記憶體,由於windows支援實體記憶體與分頁檔之間的交換,因此可提交的記憶體數量是,可用實體記憶體總量去除系統使用的實體記憶體數量後,再加上分頁檔的大小。

在windows API中,應用程式通過VirtualAlloc或VirtualAllocEx來保留或提交位址範圍;以後通過VirtualFree或VirtualFreeEx函數來解除已提交的位址範圍,或者完全釋放此位址範圍。解除提交狀態是指回到保留狀態。因此,對於進程地址空間中的任何一個頁面位址範圍,它一定處於三種狀態之一:閒置、保留的、或已提交。

對於已提交的頁面,系統會根據總的記憶體使用量情況來調度它們。當實體記憶體緊張時,系統會選擇一些頁面,將它們換出到記憶體檔案中,待下次使用的時候,再將它們換回來。通常情況下,應用程式並不需要幹預系統的頁面調度機制。在一些特殊情況下,應用程式也可以通過VirtualLock函數來鎖住已提交頁面,使得它們總是留在實體記憶體中;以後再掉用VirtualUnlock函數來結束這種鎖定。

下面給出一個例子,來說明一些windows虛擬記憶體管理的一些問題。


輸出結果全為0。

狀態一:第一個system("pause")語句處,程式剛開始運行,還沒有進行虛擬記憶體的分配操作。
狀態二:第二個system("pause")語句處,已經保留並提交虛擬記憶體,提交大小已經變化,約增加了1G,但是記憶體(專用工作集),也就是進程正在使用的實體記憶體頁面的數量並沒有相應的增加1G,也就說當commit一段位址範圍時,系統暫時也沒有真正的分配實體記憶體頁面。簡單分析一下保留和提交系統所做的工作。虛擬位址空間的管理是通過VAD樹和VAD位元影像,來記錄虛擬位址段的狀態。保留過程,系統根據虛擬位址空間的使用方式,尋找一段合格區間返回起始地址,並更新VAD樹和VAD位元影像,現在不能訪問,訪問會發生訪問違規。提交過程,記錄實體儲存體器使用開銷,分配設定PDE(頁目錄項)和PTE(頁表項)屬性。可以訪問但是並沒有分配物理頁面給進程,訪問發生分頁錯誤時,頁面處理常式進行實際的物理頁面分配。
狀態三:第三個system("pause")語句處,在每個頁面都被訪問過以後,根據分頁錯誤數量可知,每次訪問都發生了分頁錯誤,分頁錯誤處理常式分配了實體記憶體頁面,所有當所有頁面訪問過之後,系統才給整個位址區段分配了實體記憶體頁面。
由輸出結果可知,系統分配的頁面都是初始化為0的。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.