我的理解是,这是针对每个进程的,而不是针对整个进程。但根据 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 位系统)
答案1
它是虚拟地址空间每个流程,按照 MSDN 文章,以及 Raymond Chen 撰写并存档在他的博客中的一系列精彩文章。
这是他的本系列文章的索引页- 如果您作为高级系统管理员或开发人员处理大内存支持,那么非常值得一读。
答案2
它仅增加了使用魔术位编译的程序的地址空间,该魔术位可以选择性地查找这个额外的空间。
这个神奇的位是为了“大地址感知”支持。
大多数 Microsoft 程序(我相信)默认启用了此位。
互联网上有一个工具 LaaTIDO,可以启用该位。我已使用此工具为在 Windows 上运行的 Tomcat 和 Sun 的 JDK 启用大地址支持。
答案3
此标志的问题在于,一些程序员没有意识到内存位置可以超过 2 GB 的限制,这可能会导致应用程序中出现一些严重的错误。让我来解释一下原因...
指向 RAM 中地址的指针类似于某些语言中的 32 位有符号整数。有符号意味着它可以是正数或负数。现在,要检查指针是否已分配,请检查它是否等于 NULL/nil。如果它不为空,则它已分配给某个对象。一些程序员通过检查地址是否大于空来检查这一点,因此他们忘记了地址可能为负数的可能性。由于负指针小于空,系统会认为它未分配,因此为其重新分配一个新值,从而丢失其当前值并泄漏内存。
幸运的是,大多数程序员学会了检查是否相等,而不是检查是否大于 null。在这种情况下,应用程序使用最多 3 GB 的空间不会有问题。