2011-11-13 90 views
5

根據我的理解,通過閱讀幾篇文章,我假設進程地址空間(PAS)和虛擬內存(VM)是相同的。我的理解是否有缺陷?請問一些人,請闡明這一點,並點亮我?我很困惑。進程地址空間vs虛擬內存

我明白進程地址空間與Ram或物理內存無關。

但只是混淆了關於PAS和虛擬機。

回答

7

第一個:"memory" is not equal to "address space"。地址空間是可能的地址範圍。即32位指針爲4 Gb,64位指針爲16 Eb。另一方面,記憶是......好的,你可以實際使用的記憶(至少可能)。所以,我敢打賭,你問的是「進程內存」是否等於「虛擬內存」,或者「進程地址空間」是否等於「虛擬地址空間」。

第二個:虛擬內存是您可以在用戶模式下使用的唯一內存。您無法訪問物理內存。物理內存用於內核模式和驅動程序。用戶模式應用程序僅適用於虛擬內存。因此,所有內存在用戶模式下都是虛擬的。無需追加「虛擬」。這是默認的。

因此,「進程地址空間」=「[虛擬]進程地址空間」 - 即單個進程的虛擬地址空間。 「內存」也是一樣:「進程內存」=「[虛擬]進程內存」。

第三:現在,「虛擬內存」這個術語通常指的是「系統虛擬內存」(全局事物),它大於一個進程。另一方面,由於尋址是特定於進程的,因此不存在「系統虛擬地址空間」(所有進程和內核的全局地址空間)等。

因此,答案是:

  1. 「進程地址空間」= 「虛擬地址空間」= 「地址空間」
  2. 「進程內存」 <> 「虛擬內存」

示例

例如,進程地址空間的典型限制是4 Gb(適用於32位應用程序)。但是,進程虛擬內存的典型限制是2 Gb(對於32位計算機可以擴展到3 Gb,對於64位計算機可以擴展到4 Gb)。

另一方面,虛擬內存大於您的進程。考慮通過CreateFileMapping函數分配內存的情況。您可以創建64 Gb虛擬內存塊。即使64 Gb> 2 Gb也行。當然,你不能同時使用所有的64 Gb(因爲進程地址空間只有4 Gb),但你可以按512 Mb的塊來完成。

此外,請考慮將同一虛擬內存塊映射到多個位置(多個地址)的情況。

換句話說,虛擬內存和虛擬地址之間的一對一映射不存在。