在 64 位操作系统上,32 位进程可以访问多少内存?

Posted

技术标签:

【中文标题】在 64 位操作系统上,32 位进程可以访问多少内存?【英文标题】:How much memory can a 32 bit process access on a 64 bit operating system? 【发布时间】:2010-10-12 23:27:42 【问题描述】:

在 Windows 上,在正常情况下,32 位进程只能访问 2GB 的 RAM(或 3GB,在 boot.ini 文件中使用特殊开关)。在 64 位操作系统上运行 32 位进程时,有多少可用内存?是否有任何特殊的开关或设置可以改变这一点?

【问题讨论】:

msdn.microsoft.com/en-us/library/Aa366521 【参考方案1】:

默认为 2 GB。如果应用程序支持大地址空间(与 /LARGEADDRESSAWARE 链接),它会获得 4 GB(不是 3 GB,请参阅http://msdn.microsoft.com/en-us/library/aa366778.aspx)

它们仍然被限制为 2 GB,因为许多应用程序依赖于指针的最高位为零。

【讨论】:

有人能解释为什么进程不能访问完整的 4GB 吗? 什么意思?如果您自己构建它,您可以使用 /LARGEADDRESSAWARE 标志并使其与 4GB 一起工作,如果您不这样做,那么您将受到开发人员的摆布。 是因为指针可能会被二进制补码危险地解释吗? 这么说-since many application depends on the top bit of pointers to be zero你的意思是在遍历进程的地址空间时没有考虑或使用寻址方案的第32位。是吗?【参考方案2】:

如果您使用 /LARGEADDRESSAWARE 链接,则 4 GB 减去系统正在使用的内存。

Of course, you should be even more careful with pointer arithmetic if you set that flag.

【讨论】:

-1:系统会为自己使用64位地址,所以不需要减去什么 @ThomasW.,这不是真的,至少在 Windows 上是这样。 WOW64 仍然需要 32 位 thunk 才能进行 64 位系统调用。见msdn.microsoft.com/en-us/library/windows/desktop/… 您是指那些 605 kB 的 DLL?抱歉,我没听明白,因为问题更多的是关于 GB 的内存。 @ThomasW.,这就是为什么我说“减去系统正在使用的内容。” 仅供参考 链接在这个上失效了【参考方案3】:

似乎没有人提到这样一个事实,即如果您有许多不同的 32 位应用程序,wow64 子系统可以将它们映射到 4G 以上内存中的任何位置,因此在具有足够内存的 64 位窗口上,您可以运行更多 32位应用程序,而不是在原生 32 位系统上。

【讨论】:

您说的是物理 RAM,而 OP 说的是虚拟内存。即使在 32 位系统上,您也可以运行许多应用程序,只要您的页面文件足够大。【参考方案4】:

32 位进程仍受限于 64 位操作系统中的相同约束。问题是内存指针只有 32 位宽,因此程序无法分配/解析任何大于 32 位的内存地址。

【讨论】:

如果您明确指出 32 位地址 4GB 空间,这将很有用。【参考方案5】:

64 位操作系统下的单个 32 位进程限制为 2Gb。但是,如果它被编译为一个设置了IMAGE_FILE_LARGE_ADDRESS_AWARE 位的 EXE 文件,那么它的限制为 4 GB,而不是 2Gb - 请参阅https://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

您听到的有关特殊引导标志、3 GB、/3GB 开关或/userva 的信息都是关于 32 位操作系统的,不适用于 64 位 Windows。

更多详情请见https://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx。

关于 32 位操作系统,与人们的看法相反,32 位操作系统没有 4GB 的物理限制。例如,32 位服务器操作系统(如 Microsoft Windows Server 2008 32 位)可以通过物理地址扩展 (PAE) 访问高达 64 GB(Windows Server 2008 企业版和数据中心版),它首先由 Intel 在 Pentium Pro 中引入,后来由 AMD 在 Athlon 处理器中引入——它定义了一个三层的页表层次结构,每个表条目是 64 位而不是 32 位,允许这些 CPU 直接访问物理地址大于 4 GB 的空间——因此理论上,32 位操作系统理论上可以访问 2^64 字节,即 17,179,869,184 GB,但该段受限于 4GB。但是,由于营销原因,Microsoft 将非服务器操作系统上的最大可访问内存限制为仅 4GB,甚至有效的 3GB。因此,在 32 位操作系统上,单个进程可以访问超过 4GB 的空间——Microsoft SQL Server 就是一个例子。

64 位 Windows 下的 32 位进程在使用共享内核的虚拟地址空间(也称为 系统空间)方面与 64 位进程相比没有任何劣势。 64 位 Windows 下的所有进程,无论是 64 位还是 32 位,都共享相同的 64 位系统空间。

鉴于the system space is shared across all processes,在32 位Windows 上,创建大量句柄(如线程、信号量、文件等)consume system space by kernel objects 的进程可能会用完即使您总共有很多可用内存。相比之下,在 64 位 Windows 上,内核空间是 64 位的,不受 4 GB 的限制。 32 位应用程序进行的所有系统调用都是converted to native 64-bit calls in the user mode。

【讨论】:

这个问题是询问一个单个进程可以访问多少内存。这受 32 位虚拟内存地址空间的限制。当然,您可以在同一台计算机上每个使用 4GB 的多个 32 位进程,即使是使用 PAE 的 32 位操作系统。但这不是 this 问题所要问的。 @PeterCordes - 抱歉,谢谢 - 我已经更新了关于 2GB/4GB 限制的答案。 @PeterCordes,谢谢你的评论,我已经更新了回复,强调多个 32 位进程可以在同一台计算机上每个使用 4GB,即使是使用 PAE 的 32 位操作系统,并且64 位操作系统下的 32 位进程不受 2GB 系统空间限制的影响,这在 32 位操作系统下是个问题。【参考方案6】:

在 Win64 下运行 32 位进程时,您有同样的基本限制。您的应用程序在 32 但子系统中运行,该子系统尽力看起来像 Win32,这将包括您的进程的内存限制(您的内存限制为 2GB,操作系统为 2GB)

【讨论】:

【参考方案7】:

限制不是 2g 或 3gb,32bit 是 4gb。

人们认为它是 3gb 的原因是,当他们真正拥有 4gb 系统内存时,操作系统显示 3gb free。

它的总内存为 4GB。因此,如果您有一个 1 GB 的视频卡,它算作 32 位操作系统查看的总内存的一部分。

4Gig 不是 3 不是 2 明白了吗?

【讨论】:

这是不正确的。对于标准的 x86 系统(无内存扩展),内核可以访问全部 4GiB 的内存空间(即使计算机由于分页而只有 1GiB 的 ram)。内核保留较高的 2GiB(某些内核保留 1GiB 或 3GiB)供自己使用。每个进程的虚拟内存也映射了内核的保留内存,因此进程不能使用 2GiB 的内存。 另外,显卡与进程可以使用的内存量无关。 ACPI 表、内存映射 IO 等会用完物理内存地址,但由于虚拟内存而避免了这种情况。 这是不正确的。 Microsoft 选择(设计选择)将 Virtual 32 位地址空间与 Windows NT 分开,以便保留 2GB 用于映射操作系统(驱动程序/API/系统调用等),剩余 2GB 用于应用程序使用。 /3GB 引导开关改变了这种行为(1GB 用于操作系统映射,3GB 用于应用程序代码)。我留下寻找旧的 Windows NT 3.x 虚拟内存架构文档作为读者的练习:-)

以上是关于在 64 位操作系统上,32 位进程可以访问多少内存?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 从 32 位进程访问 64 位 dll

在 64 位(或 32 位)Windows 上以 32 位进程访问 >2、3、4GB 文件

检查正在运行的进程是 32 位还是 64 位

如何使 .NET 可执行文件在 64 位操作系统上作为 32 位进程运行?

确定当前的 PowerShell 进程是 32 位还是 64 位?

Wow64DisableWow64FsRedirection 在 32 位 Windows XP 上