在工作中,我可以选择安装 16GB 的 64 位 Windows 7。我能想到的最大好处是 Windows 7 64 位可以利用 4GB 以上的内存。我的一位同事说,即使我安装了 Windows 7 64 位,32 位应用程序也无法寻址所有内存。这让我很困惑,不确定这是否意味着只有 64 位应用程序才能在 4GB 到 16GB 之间的内存空间中运行。如果我运行 10 个 32 位应用程序,每个使用 1GB,我应该能够在没有分页的情况下做到这一点,对吗?
答案1
每个程序都在自己的虚拟内存空间中运行。程序向操作系统请求内存时,这些内存以 1MB 的块为单位进行分配。程序将此内存视为一个大的连续内存块(即所谓的“平面内存模型”)。这与旧的 16 位模型“分段内存”模型不同,在旧模型中,两个寄存器将组合成一个 20 位或 32 位内存地址,具体取决于内存控制器的当前操作模式。
每个 32 位程序的总可用内存将被限制为 2GB;从 0x20000000 开始的内存区域用于 32 位应用程序中的 DLL。确实,单个个体32 位应用程序无法访问全部 16GB 内存,因为并非所有内存都是可寻址的。但是,每个程序都从其虚拟内存块的底部(接近 0x00000000)开始,并且虚拟内存管理器会将这些位置偏移到 RAM 中的实际物理位置,因此从这个意义上讲,32 位程序可以驻留在物理内存中的任何位置。从概念上讲,这意味着您可以只用 32 位程序填充全部 16GB RAM。
32 位和 64 位应用程序都可以并行运行,并且可以位于 RAM 中的任何位置。请注意,分页在内存耗尽之前发生,因此您仍然不可能在不发生分页的情况下运行 16 个 1GB RAM 应用程序。系统会尝试保留一些空闲的物理内存,并将其用作磁盘读写的缓存。
请注意,即使是 32 位操作系统能可以访问超过 4GB 的内存,但每个单独的应用程序仍然被限制在 4GB 以内。这是因为一种相对较旧的技术,称为 PAE(物理地址扩展)。32 位 Windows 不允许您访问超过 2GB/4GB 的内存(这是许可问题),但 32 位版本的 Linux 可以在 16GB 的系统上运行,并且可以完全访问安装的内存。某些 32 位版本的 Windows Server 也可以访问超过 4GB 的内存:“Windows Server 2008 Datacenter”可以在 32 位处理器上使用高达 64GB 的 RAM。