試試渲染,最合適自己的講解方式:流程中穿插概念。
程式運行需經由記憶體執行。所以講講windows記憶體體繫結構。
windows記憶體體繫結構由虛擬位址空間和記憶體兩部分組成。
記憶體:
如果每個程式運行都直接佔用記憶體,那你開一個冰封王座豈不是要佔1G的記憶體?還能不能幹別的了。虛擬位址空間的設計簡直是神來之筆。
給每個進程分配一個4G(對32位系統來說)的虛擬位址空間。進程直接操作虛擬位址空間,讀寫資料時,才給它調撥實體儲存體器。
實體記憶體和虛擬記憶體關係:實體記憶體和虛擬記憶體對應。除OS外任何程式都不會直接存取實體記憶體而是訪問虛擬記憶體。可把虛擬記憶體等同於實體記憶體。以後就只說記憶體,不再區分實體記憶體和虛擬記憶體。
分頁檔和虛擬記憶體關係:可把虛擬記憶體等同於實體記憶體。改變分頁檔大小可改變虛擬記憶體大小。詳細來說:分頁檔只是改變了實體記憶體的大小,當然也改變了虛擬記憶體的大小。(猜測:實體記憶體和虛擬記憶體的映射在大小上是1:1的。)可禁用分頁檔但不能禁用虛擬記憶體。
虛擬位址空間和物理地址空間對應:虛擬位址空間指的是進程的可用地址空間範圍。而物理地址空間指的是實際可用的記憶體空間範圍。
虛擬位址空間:
虛擬位址空間也是分區的,並不是所有都可供使用者使用。
系統建立進程並賦予它地址空間時,可用空間中的大部分都是閑置的或未分配的。要使用這部分地址空間,必須調用VirtualAlloc來分配其中的地區。分配地區的操作成為預訂。預訂地址空間時,系統會確保地區的起始地址正好是分配粒度的整數倍,地區大小正好是系統頁面大小的整數倍。(分配粒度和系統頁面大小據CPU不同而不同。)VirtualFree來釋放分配的地區。
要使用所預定的地址空間,必須分配實體儲存體器,並將儲存空間映射到所預訂的地區。此過程稱為調撥實體儲存體器。實體儲存體器的調撥同預定地區一樣,也是以頁面為單位來進行。通過VirtualAlloc來調撥實體儲存體器,VirtualFree來釋放實體儲存體器
頁分頁檔:
如今OS能把磁碟空間當記憶體使用量,就是讀寫速度比較慢。磁碟上的檔案一般稱為頁分頁檔。把記憶體上的一部分儲存到頁分頁檔中,並在應用程式需要時再將頁分頁檔中的對應部分載入記憶體。VirtualAlloc把實體儲存體器調撥給地址空間地區時,該空間實際上是從硬碟上的頁分頁檔分配的。
不在頁分頁檔中維護的實體儲存體器:
當執行一個程式時,系統會開啟該程式對應的.exe檔案並計算出應用程式的代碼和資料的大小。然後系統會預訂一塊地址空間,並註明與該地區相關聯的實體儲存體器就是.exe檔案本身。系統並沒有從頁分頁檔中分配空間,而是將.exe檔案的實際內容(或叫檔案映像)用作程式預訂的地址空間地區。這樣,不但載入程式快,而且頁分頁檔大小也合適。
當把一個程式位於硬碟上的檔案映像(即一個.exe或DLL檔案)用作地址空間地區對應的實體儲存體器時,稱這個檔案映像為記憶體對應檔。當載入一個.exe或DLL時,系統會自動預訂地址空間地區並把檔案映像映射到該地區,但系統也提供了一組函數,可讓開發人員把資料檔案映射到地址空間。
虛擬記憶體就是程式碼因不能直接存取實體記憶體而間接訪問實體記憶體的機制。或者更具體點的這麼說:虛擬記憶體技術說白了就是先給程式預訂虛擬位址空間,再在需要時給虛擬位址空間調撥實體儲存體器,這樣節省記憶體。
總匯:
參考文獻:點擊開啟連結和點擊開啟連結