每個程序都有乙個私有的虛擬位址空間
系統將每個程序的虛擬位址空間對映到物理記憶體上
為了實現每個程序都有乙個私有的虛擬位址空間系統為每個程序都建立了乙個頁目錄和一組頁表
每個程序的頁表是獨立的
而核心空間的頁表是所有程序共享的
x86平台上有乙個cr3暫存器,該暫存器儲存當前執行的程序的頁目錄位址
系統進行程序切換時,會將cr3內的位址置為將要執行的程序的頁目錄位址
每個程序都有乙個kprocess結構的屬性,其中包括了程序頁目錄位址
二:資料共享與保護
有一些程序間共享的資料,系統的可執行**(系統dll)等,在各個程序間都是一致的
由此可得:不同程序的虛擬記憶體分頁可以對映為相同的物理記憶體分頁
如果多個程序同時向乙個dll檔案寫入資料怎麼辦?
系統是通過copy-on-write實現資料保護的
1.程序將某個系統dll加載入程序記憶體空間
2.開始對該dll進行寫操作
3.作業系統監視到寫操作將要進行
4.系統將程序虛擬記憶體分頁對映到另乙個新的物理記憶體分頁(此分頁是不共享的)
5.系統將dll的內容也對映到這個新的物理記憶體分頁
6.在新的物理記憶體分頁上完成寫操作
這樣就不會影響到其他程序訪問該dll了
三:虛擬記憶體布局、分工、堆和棧
虛擬記憶體空間分兩部分,低2g由應用程式使用,高2g由系統核心使用
應用程式使用的虛擬記憶體空間分為 **,資料(全域性變數),系統和使用者dll的**,各執行緒的棧,堆等
程序的每個執行緒都有自己的棧
棧與函式的呼叫,執行和返回 區域性變數的儲存相關
堆是一種可以動態分配和釋放的記憶體
記憶體分配函式都是通過堆進行分配記憶體的
四:總結
虛擬位址空間中的資料是分頁管理的
應用程式不用考慮系統中其他應用程式使用記憶體的情況
虛擬位址並不是實體地址空間中的位址
如果系統中沒有足夠的物理記憶體供使用,那麼作業系統會將當前沒有使用的記憶體分頁排程到硬碟上儲存起來,應用程式不用關心系統怎麼實現排程的
WinApi學習筆記 分配和釋放虛擬記憶體
include windows.h include stdio.h include iostream using namespace std intmain void std cout alloc mem commit mem reserve std endl copymemory lpaddres...
WinApi學習筆記 分配和釋放虛擬記憶體
code include windows.h include stdio.h include iostream using namespace std intmain void std cout alloc mem commit mem reserve std endl copymemory lpa...
uC GUI學習筆記 記憶體管理
與uc os記憶體管理相似,ucgui也存在類似儲存控制塊的結構,不過它不叫記憶體控制塊,而叫記憶體分配資訊節點 或叫記憶體管理單元 方便起見,我們暫且也將其稱為儲存控制塊。儲存控制塊以陣列形式存在,同時也構成雙向鍊錶,而ucos中的儲存控制塊則是單向鍊錶。與ucos記憶體管理剛好相反,在ucos中...