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

90
在Windows操作系统下,普通情况下32位进程只能访问2GB的内存(通过boot.ini文件中的特殊开关可以实现3GB)。在64位操作系统上运行32位进程时,可用内存有多少?是否有任何特殊开关或设置可以更改这个情况?

http://msdn.microsoft.com/en-us/library/Aa366521 - Martin Ba
7个回答

97

默认情况下为 2 GB。如果应用程序具有大地址空间感知功能(使用 /LARGEADDRESSAWARE 链接),则可获得 4 GB(而不是 3 GB,请参见http://msdn.microsoft.com/en-us/library/aa366778.aspx)。

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


7
为什么进程无法访问完整的4GB内存? - BlueTrin
1
你的意思是什么?如果你自己构建,可以使用/LARGEADDRESSAWARE标志,并使其能够在4GB下运行,如果没有,则取决于开发人员。 - SilverbackNet
因为指针可能会被解释为二进制补码,所以这是危险的吗? - rosstex
2
你的意思是,许多应用程序依赖于指针的最高位为零,这意味着在遍历进程的地址空间时不考虑或使用寻址方案的第32位。是这样吗? - RBT
1
@RBT:它被硬件使用。假定某些软件使用标记指针,假设顶部位为零并在那里保留自己的数据。在解引用之前,它们将使用“ptr &= 0x7FFFFFFF”将其清除为始终为零。如果原始指针值在高位具有零,则这很好,但如果所有32位实际上都是重要的,则不会。 - Peter Cordes

21

-1:系统将为自身使用64位地址,因此无需减去任何东西。 - Thomas Weller
2
@ThomasW.,这并不是完全正确的,在Windows系统上至少是这样。WOW64仍需要32位thunks用于64位系统调用。请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/aa384274(v=vs.85).aspx。 - MSN
1
你是指那605 kB的DLL吗?抱歉,我没有理解问题,因为它更多关于GB内存的。 - Thomas Weller
8
@ThomasW.,这就是我说“减去系统正在使用的部分”的原因。 - MSN

15

似乎没有人触及一个事实,即如果您有许多不同的32位应用程序,则wow64子系统可以将它们映射到4G以上的任何内存位置,因此在具有足够内存的64位Windows上,您可以运行比本机32位系统更多的32位应用程序。


7
你谈论的是实际内存,而原帖是在谈虚拟内存。即使在32位系统中,只要你的页面文件足够大,你也可以运行许多应用程序。 - Thomas Weller

7

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


4
如果您明确指出32位地址可以寻址4GB的空间,那么这将非常有用。 - Engineer

7
在64位操作系统下,一个单独的32位进程被限制为2GB。但如果它被编译成一个带有IMAGE_FILE_LARGE_ADDRESS_AWARE位设置的EXE文件,则其限制为4GB,而不是2GB-请参见https://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx
关于特殊引导标志、3GB、/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企业版和数据中心版),这是由英特尔在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位还是32位进程,在64位Windows下都共享相同的64位系统空间。
考虑到系统空间在所有进程中共享,因此在32位Windows上,创建大量句柄(如线程、信号量、文件等)的进程会通过内核对象消耗系统空间,并且即使总内存可用很多,也可能耗尽内存。相比之下,在64位Windows上,内核空间是64位的,不受4GB限制。由32位应用程序发出的所有系统调用都会在用户模式中转换为本机64位调用。

1
这个问题询问的是一个单一进程可以访问多少内存。这受到32位虚拟内存地址空间的限制。 当然,你可以在同一台计算机上使用多个32位进程,每个进程都使用4GB,即使使用PAE的32位操作系统也是如此。但这不是这个问题所问的。 - Peter Cordes
@PeterCordes - 抱歉并感谢您 - 我更新了关于2GB / 4GB限制的答案。 - Maxim Masiutin
@PeterCordes,感谢您的评论,我已更新回复以强调多个32位进程可以在同一台计算机上每个使用4GB,即使使用PAE的32位操作系统,并且64位操作系统下的32位进程不会受到2GB系统空间限制的影响,这是在32位操作系统下存在的问题。 - Maxim Masiutin

-1

在Win64下运行32位进程时,你将面临相同的基本限制。你的应用程序在一个32位子系统中运行,尽可能地模拟Win32,并且这将包括进程的内存限制(你的下2GB,操作系统的上2GB)。


-12

限制不是2g或3gb,而是32位系统的4gb。

人们认为它是3gb的原因是操作系统显示有3gb可用内存,但实际上他们有4gb的系统内存。

总共有4gb的RAM。所以如果您有1 gb的显卡,它将计入32位操作系统查看的总内存中。

4Gig而不是3或2,明白了吗?


2
那是不正确的。对于标准的x86系统(没有内存扩展),内核可以访问完整的4GiB内存空间(即使计算机只有1GiB的RAM也是如此,因为会进行分页)。内核保留了上面2GiB的地址空间(某些内核可能会保留1GiB或3GiB),用于自身的使用。每个进程的虚拟内存也将映射内核保留的内存,因此该进程无法使用2GiB的内存。 - Alex Jorgenson
3
此外,显卡与进程可使用的内存量无关。ACPI表、内存映射IO等使用物理内存地址,但由于虚拟内存的存在,这种情况得以避免。 - Alex Jorgenson
1
这是不正确的。微软选择(设计选择)在Windows NT中将虚拟 32位地址空间分为2GB,其中2GB保留用于映射操作系统(驱动程序/API/系统调用等),其余2GB用于应用程序使用。 /3GB启动开关更改此行为(1GB用于OS映射,3GB用于应用程序代码)。我留给读者找到旧的Windows NT 3.x虚拟内存架构文档作为练习 :-) - ripvlan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接