我的理解是,它是每个过程,而不是整个过程。但根据 Windows Server 2003 和 Windows 2000 (KB283037) 中提供大内存支持:
通常,在 Windows 2000 或 Windows Server 2003 下运行的进程最多可以访问 2 GB 的内存地址空间(假设未使用 /3GB 开关),其中一些内存是物理内存,一些是虚拟内存。运行的程序(因此,更多的进程)越多,您提交到完整 2 GB 地址空间的内存就越多。
这对我来说意味着你运行的程序越多,你就越有可能达到 2GB 的地址空间限制,即程序 A 使用 500MB,程序 B 使用 1GB,所以你的其余程序只有 500MB 的地址空间。
然而,MSDN 文章http://msdn.microsoft.com/en-us/library/ms189334.aspx将此称为进程地址空间,对我来说意味着每个应用程序都有自己的 地址空间,无论是 2GB 还是 3GB,具体取决于boot.ini 中使用了什么开关。
那么它是每个过程还是整个过程?知识库文章是否错误(或措辞不当)?
(请注意,我说的只是 32 位系统)
它是每个进程的虚拟地址空间,根据 MSDN 文章,以及 Raymond Chen 撰写并存档在他的博客上的一系列精彩文章。
这是他的这一系列文章的索引页——如果您作为高级系统管理员或开发人员处理大内存支持,那么非常值得一读。
它只会增加使用魔术位编译的程序的地址空间,该魔术位可以选择查找此额外空间。
这个魔术位用于“大地址感知”支持。
大多数 Microsoft 程序(我相信)默认启用此位。
互联网上有一个可用的工具 LaaTIDO 可以启用此位。我已使用此工具为在 Windows 上运行的 Tomcat 和 Sun 的 JDK 启用大地址支持。
这个标志的问题是一些程序员没有意识到内存位置可以超过 2 GB 的限制,这可能会导致应用程序中出现一些令人讨厌的错误。让我解释一下为什么...
指向 RAM 中地址的指针类似于某些语言中的 32 位有符号整数。有符号表示它可以是正数或负数。现在,要检查是否分配了指针,请检查它是否等于 NULL/nil。如果它不为空,则它被分配给某物。一些程序员通过检查地址是否大于空来检查这一点,因此他们忘记了地址可能为负的可能性。由于负指针小于 null,系统会认为它未分配,因此重新分配一个新值给它,丢失它的当前值并泄漏内存。
幸运的是,大多数程序员学会了检查它是否相等而不是大于 null。在这种情况下,应用程序使用最多 3 GB 将没有问题。