【发布时间】:2014-09-12 05:39:48
【问题描述】:
假设一个 32 位/64 位处理器,一个 4GB 进程可以在 2GB RAM 上运行。它会使用虚拟内存还是根本不会运行?
【问题讨论】:
-
很确定这更多地取决于它是如何编译的以及程序本身使用了多少 RAM。
标签: memory-management operating-system out-of-memory virtual-memory
假设一个 32 位/64 位处理器,一个 4GB 进程可以在 2GB RAM 上运行。它会使用虚拟内存还是根本不会运行?
【问题讨论】:
标签: memory-management operating-system out-of-memory virtual-memory
这高度依赖于平台。在许多 32 位操作系统上,无论安装的物理内存或分配的虚拟内存如何,单个进程都不能使用超过 2GB 的内存。
例如,我的工作计算机使用带有 PAE(物理地址扩展)的 32 位 Linux,以允许它安装 16GB 的 RAM。但是,每个进程 2GB 的限制仍然适用。拥有额外的 RAM 只会让我运行更多单独的进程。 32位Windows也是如此。
64 位操作系统更像是一个混合包。 64 位 Linux 将允许单个进程映射超过 32GB 的内存(但同样,内核因内核而异)。您将仅受您拥有的交换量(Linux 虚拟内存)的限制。 64 位 Windows 完全是废话。某些版本每个进程只允许 2GB,但大多数版本允许 >32GB,仅受用户分配的页面文件数量的限制。
Microsoft 提供了一个有用的table,打破了各种操作系统版本/版本的各种内存限制。不幸的是,没有这样的表,我可以粗略地搜索 Linux,因为它太分散了。
【讨论】:
简短回答:取决于系统。
大多数 32 位系统的每个进程限制为 2GB。如果您的系统允许每个进程 >2GB,那么我们可以继续您问题的下一部分。
大多数现代系统都使用虚拟内存。然而,有一些受限制的(和各种旧的)系统会用完空间并让你哭泣。我相信uClinux 支持 MMU 和 MMU-less 架构。 大多数 32 位处理器都有 MMU(少数没有,请参阅 ARM Cortex-M0),少数 16 位或 8 位处理器也有(请参阅 Atmel ATtiny13A-MMU 和 @987654324 @)。
任何需要比物理可用内存更多的进程都需要某种形式的内存交换(例如,分区或文件)。
虚拟内存按页面划分。在某些时候,一个页面要么驻留在 RAM 中,要么驻留在 Swap 中。任何访问未加载到 RAM 中的内存页面的尝试都会触发名为 Page Fault 的中断,该中断由内核处理。
【讨论】:
假设磁盘交换空间可用,在 64 位操作系统上需要 4GB 的 64 位进程通常可以在 2GB 物理 RAM 中运行访问。
实际上,32 位进程无法准确寻址 4GB 内存(操作系统需要一些地址空间开销),因此它不会运行。根据操作系统,它可能可以运行需要 > 2GB 和
【讨论】: