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


86

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


Answers:


92

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

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


5
有人可以解释为什么进程无法访问完整的4GB吗?
BlueTrin

1
你什么意思?如果您自己构建它,则可以使用/ LARGEADDRESSAWARE标志并将其与4GB一起使用,如果没有构建,则由这样做的开发人员摆布。
SilverbackNet

是因为指针可能会危险地用二进制补码解释吗?
rosstex 2015年

1
这样-since many application depends on the top bit of pointers to be zero您的意思是遍历进程的地址空间时不会考虑或使用寻址方案的第32位,是吗?
RBT

21

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

当然,如果设置了该标志,则应该更加小心使用指针算法。


-1:系统将为其自身使用64位地址,因此无需减去某些内容
我确定我缺少

@ThomasW。,至少在Windows上不是这样。WOW64仍需要32位thunk才能进行64位系统调用。请参阅msdn.microsoft.com/en-us/library/windows/desktop/…–
MSN

1
您是说这605 KB的DLL?抱歉,我没有得到,因为问题更多是关于GB的内存。
而且我确定我想念一下

7
@ThomasW。,这就是为什么我说“减去系统正在使用的内容”的原因。
MSN

仅供参考,FYI Link死于这一事件
jjxtra

14

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


7
您在谈论物理RAM,OP在谈论虚拟内存。即使在32位系统上,只要页面文件足够大,您也可以运行许多应用程序。
而且我确定我想念一下

8

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


4
如果您明确指出32位寻址4GB空间,这将很有用。
工程师

4

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

您所听到的有关特殊启动标志,3 GB,/3GB开关的信息或/userva全部有关32位操作系统的信息,不适用于64位Windows。

有关更多详细信息,请参见https://msdn.microsoft.com/zh-cn/library/aa366778(v=vs.85).aspx

关于32位操作系统,与之相反,对于32位操作系统没有4GB的物理限制。例如,像Microsoft Windows Server 2008 32位这样的32位服务器操作系统最多可以访问64 GB(Windows Server 2008 Enterprise和Datacenter版本)–通过物理地址扩展(PAE),它由Intel在Pentium Pro中首先引入,然后由AMD在Athlon处理器中引入–它定义了一个三层的页表层次结构,表条目各为64位而不是32位,从而使这些CPU可以直接访问大于4 GB的物理地址空间-因此,理论上,一个32位OS可以理论上访问2 ^ 64个字节,即17,179,869,184 GB,但是该段是受4GB限制。但是,由于市场原因,Microsoft将非服务器操作系统上的最大可访问内存限制为仅4GB,甚至有效地为3GB。因此,一个进程可以在32位OS上访问超过4GB的内存-以Microsoft SQL Server为例。

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

考虑到所有进程都共享系统空间的事实,在32位Windows上,创建大量句柄(例如线程,信号量,文件等)的进程会被内核对象占用系统空间,甚至会耗尽内存。如果您总共有很多可用内存。相反,在64位Windows上,内核空间为64位,不受4 GB限制。在用户模式下,由32位应用程序进行的所有系统调用都将转换为本地64位调用


1
这个问题问一个进程可以访问多少内存。这受32位虚拟内存地址空间的限制。当然,你可以有多个32位进程每次使用4GB的同一台计算机上,即使使用PAE的32位操作系统。但这不是这个问题要问的。
彼得·科德斯

@PeterCordes-抱歉,谢谢-我已经更新了有关2GB / 4GB限制的答案。
Maxim Masiutin

@PeterCordes,谢谢您的发言,我更新了答复以强调多个32位进程可以在同一台计算机上使用4GB,即使使用PAE的32位操作系统也是如此,并且32位进程在64-位操作系统不受2GB系统空间的限制,这在32位操作系统下是个问题。
Maxim Masiutin

-1

在Win64下运行32位进程时,您具有相同的基本限制。您的应用程序运行在32位但子系统看起来最好类似于Win32的子系统中,这将包括您的进程的内存限制(对您来说较低的2GB,对操作系统来说较高的2GB)


-11

限制不是2g或3gb(32位是4gb)。

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

它的总RAM为4GB。因此,如果您有一个1 gb的视频卡,该视频卡已计入32位操作系统查看的总内存中。

4Gig不是3不是2得到了吗?


2
那是不对的。对于标准的x86系统(无内存扩展),内核可以访问全部4GiB的内存空间(即使由于分页而导致计算机仅具有1GiB的内存)。内核保留上层2GiB(某些内核保留1GiB或3GiB)供自己使用。每个进程的虚拟内存还映射了内核的保留内存,因此该进程无法使用2GiB的内存。
Alex Jorgenson

3
此外,视频卡与进程可以使用的内存量无关。ACPI表,内存映射的IO等用尽了物理内存地址,但由于使用了虚拟内存,因此可以避免使用。
Alex Jorgenson

1
这是不正确的。微软选择(设计选择)使用Windows NT拆分虚拟32位地址空间,以便为映射OS(驱动程序/ API /系统调用等)保留2GB,其余2GB供App使用。/ 3GB引导开关可更改此行为(操作系统映射为1GB,应用程序代码为3GB)。我留下了寻找旧的Windows NT 3.x虚拟内存体系结构文档作为练习的读者:-)
ripvlan 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.