进程地址空间vs虚拟内存

从我的理解,通过阅读几篇文章,我假设进程地址空间(PAS)和虚拟内存(VM)是相同的。 我的理解是否有缺陷? 请问一些人可以点亮这个灯并点亮我? 我很困惑。

我了解进程地址空间与Ram或物理内存无关。

但是只是混淆了PAS和VM。

第一: “内存”不等于“地址空间” 。 地址空间是可能的地址范围。 也就是说,32位指针是4 Gb,64位指针是16 Eb。 另一方面,内存是…,你可以实际使用的内存(至少可能)。 所以,我敢打赌你问是否“进程内存”等于“虚拟内存”,或者“进程地址空间”是否等于“虚拟地址空间”。

第二:虚拟内存是您可以在用户模式下使用的唯一内存。 您无法访问物理内存。 物理内存用于内核模式和驱动程序。 用户模式应用程序只能使用虚拟内存。 因此,所有内存在用户模式下都是虚拟的。 没有必要追加“虚拟”。 这是默认的。

因此,“进程地址空间”=“[虚拟]进程地址空间” – 即单进程的虚拟地址空间。 “内存”也是一样:“进程内存”=“[虚拟]进程内存”。

第三:现在“虚拟内存”这个术语通常指的是“系统虚拟内存”(全局事物),它比一个进程要大。 另一方面,因为寻址是特定于进程的,所以“系统虚拟地址空间”(全部进程和内核的全局地址空间)不存在。

所以答案是:

  1. “进程地址空间”=“虚拟地址空间”=“地址空间”
  2. “进程内存”<>“虚拟内存”

例子

例如,进程地址空间的典型限制是4 Gb(对于32位应用程序)。 但是,进程虚拟内存的典型限制是2 Gb(对于32位计算机可以扩展到3 Gb,对于64位计算机可以扩展到4 Gb)。

另一方面,虚拟内存大于您的进程。 考虑通过CreateFileMapping函数分配内存的情况。 你可以创建64 Gb虚拟内存块。 即使64 Gb> 2Gb也行。 当然,你不能同时使用所有的64 Gb(因为进程地址空间只有4 Gb),但是你可以以512 Mb为单位进行分块。

此外,请考虑将同一个虚拟内存块映射到多个位置(多个地址)的情况。

换句话说,虚拟内存和虚拟地址之间的一对一映射不存在。