在 Windows 上,在正常情况下,32 位进程只能访问 2GB 的 RAM(或 3GB,在 boot.ini 文件中使用特殊开关)。在 64 位操作系统上运行 32 位进程时,有多少可用内存?是否有任何特殊的开关或设置可以改变这一点?
7 回答
默认为 2 GB。如果应用程序支持大地址空间(与 /LARGEADDRESSAWARE 链接),它会获得 4 GB(不是 3 GB,请参阅http://msdn.microsoft.com/en-us/library/aa366778.aspx)
它们仍然限制为 2 GB,因为许多应用程序依赖于指针的最高位为零。
如果您与 /LARGEADDRESSAWARE 链接,则 4 GB 减去系统正在使用的内存。
似乎没有人提到这样一个事实,即如果你有许多不同的 32 位应用程序,wow64 子系统可以将它们映射到 4G 以上内存中的任何位置,因此在具有足够内存的 64 位窗口上,你可以运行更多的 32 位应用程序比在本机 32 位系统上。
32 位进程仍然受限于 64 位操作系统中的相同约束。问题是内存指针只有 32 位宽,因此程序无法分配/解析任何大于 32 位的内存地址。
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 位)最多可以访问64 GB(Windows Server 2008 企业版和数据中心版)——通过物理地址扩展 (PAE),它首先由 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 位系统空间。
鉴于系统空间由所有进程共享,在32 位 Windows上,创建大量句柄(如线程、信号量、文件等)的进程会消耗内核对象的系统空间,甚至可能耗尽内存如果您总共有很多可用内存。相比之下,在64 位 Windows上,内核空间是 64 位的,不受 4 GB 的限制。32 位应用程序进行的所有系统调用都在用户模式下转换为本机 64 位调用。
在 Win64 下运行 32 位进程时,您有相同的基本限制。您的应用程序在 32 但子系统中运行,该子系统尽力看起来像 Win32,这将包括您的进程的内存限制(您的内存限制为 2GB,操作系统为 2GB)
限制不是 2g 或 3gb,32 位是 4gb。
人们认为它的 3gb 的原因是操作系统显示 3gb 空闲时他们真的有 4gb 的系统内存。
它的总内存为 4GB。因此,如果您有一个 1 GB 的视频卡,它算作 32 位操作系统查看的总内存的一部分。
4Gig 不是 3 不是 2 明白了吗?