虛擬內存 地址空間

試試渲染,最合適自己的講解方式:流程中穿插概念。

程序運行需經由內存執行。所以講講windows內存體系結構。

windows內存體系結構由虛擬地址空間和內存兩部分組成。

內存:

如果每個程序運行都直接佔用內存,那你開一個冰封王座豈不是要佔1G的內存?還能不能幹別的了。虛擬地址空間的設計簡直是神來之筆。

給每個進程分配一個4G(32位系統來說)的虛擬地址空間。進程直接操作虛擬地址空間,讀寫數據時,纔給它調撥物理存儲器。

物理內存和虛擬內存關係:物理內存和虛擬內存對應。除OS外任何程序都不會直接訪問物理內存而是訪問虛擬內存。可把虛擬內存等同於物理內存。以後就只說內存,不再區分物理內存和虛擬內存。

頁面文件和虛擬內存關係:可把虛擬內存等同於物理內存。改變頁面文件大小可改變虛擬內存大小。詳細來說:頁面文件只是改變了物理內存的大小,當然也改變了虛擬內存的大小。(猜測:物理內存和虛擬內存的映射在大小上是1:1的。)可禁用頁面文件但不能禁用虛擬內存。

虛擬地址空間和物理地址空間對應:虛擬地址空間指的是進程的可用地址空間範圍。而物理地址空間指的是實際可用的內存空間範圍。

虛擬地址空間:

虛擬地址空間也是分區的,並不是所有都可供用戶使用。

系統創建進程並賦予它地址空間時,可用空間中的大部分都是閒置的或未分配的。要使用這部分地址空間,必須調用VirtualAlloc來分配其中的區域。分配區域的操作成爲預訂。預訂地址空間時,系統會確保區域的起始地址正好是分配粒度的整數倍,區域大小正好是系統頁面大小的整數倍。(分配粒度和系統頁面大小據CPU不同而不同。)VirtualFree來釋放分配的區域。

要使用所預定的地址空間,必須分配物理存儲器,並將存儲器映射到所預訂的區域。此過程稱爲調撥物理存儲器。物理存儲器的調撥同預定區域一樣,也是以頁面爲單位來進行。通過VirtualAlloc來調撥物理存儲器,VirtualFree來釋放物理存儲器

頁交換文件:

如今OS能把磁盤空間當內存使用,就是讀寫速度比較慢。磁盤上的文件一般稱爲頁交換文件。把內存上的一部分保存到頁交換文件中,並在應用程序需要時再將頁交換文件中的對應部分載入內存。VirtualAlloc把物理存儲器調撥給地址空間區域時,該空間實際上是從硬盤上的頁交換文件分配的。

不在頁交換文件中維護的物理存儲器:

當執行一個程序時,系統會打開該程序對應的.exe文件並計算出應用程序的代碼和數據的大小。然後系統會預訂一塊地址空間,並註明與該區域相關聯的物理存儲器就是.exe文件本身。系統並沒有從頁交換文件中分配空間,而是將.exe文件的實際內容(或叫文件映像)用作程序預訂的地址空間區域。這樣,不但載入程序快,而且頁交換文件大小也合適。

當把一個程序位於硬盤上的文件映像(即一個.exeDLL文件)用作地址空間區域對應的物理存儲器時,稱這個文件映像爲內存映射文件。當載入一個.exeDLL時,系統會自動預訂地址空間區域並把文件映像映射到該區域,但系統也提供了一組函數,可讓開發人員把數據文件映射到地址空間。

虛擬內存就是程序代碼因不能直接訪問物理內存而間接訪問物理內存的機制。或者更具體點的這麼說:虛擬內存技術說白了就是先給程序預訂虛擬地址空間,再在需要時給虛擬地址空間調撥物理存儲器,這樣節省內存。

總彙:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章