进程地址空间与虚拟内存

Posted

技术标签:

【中文标题】进程地址空间与虚拟内存【英文标题】:Process Address Space vs Virtual Memory 【发布时间】:2011-12-27 21:52:26 【问题描述】:

根据我阅读几篇文章的理解,我认为进程地址空间(PAS)和虚拟内存(VM)是相同的。我的理解有问题吗?有人可以阐明这一点并照亮我吗?我很困惑。

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

但只是对 PAS 和 VM 感到困惑。

【问题讨论】:

【参考方案1】:

第一: "memory" is not equal to "address space"。地址空间是可能的地址范围。 IE。 32 位指针为 4 Gb,64 位指针为 16 Eb。另一方面,内存是......嗯,你可以实际使用的内存(至少可能)。所以,我敢打赌,你问的是“进程内存”是否等于“虚拟内存”,或者“进程地址空间”是否等于“虚拟地址空间”。

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

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

第三:现在,“虚拟内存”一词通常指的是“系统虚拟内存”(全局事物),它不仅仅是一个进程。另一方面:由于寻址是特定于进程的,因此没有“系统虚拟地址空间”(所有进程和内核的全局地址空间)之类的东西。

所以,答案是:

    “进程地址空间”=“虚拟地址空间”=“地址空间” “进程内存”“虚拟内存”

示例

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

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

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

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

【讨论】:

以上是关于进程地址空间与虚拟内存的主要内容,如果未能解决你的问题,请参考以下文章

进程地址空间与虚拟内存

Binder 机制进程通信 | 用户空间与内核空间 | MMU 与虚拟内存地址

浅谈进程地址空间与虚拟存储空间

浅谈进程地址空间与虚拟存储空间

Linux虚拟内存相关知识

进程的虚拟地址空间分布