2 GB真的是我最大的吗?

时间:2011-03-11 17:59:32

标签: c# .net

Process Address Space 告诉我,我的.NET应用程序最多只能在Windows XP上使用2 GB。真的吗?

但是,如果我有一个20 TB的硬盘驱动器怎么办?它是否无法使用某些驱动器空间?

2 个答案:

答案 0 :(得分:166)

说这与RAM有关的答案是非常错误的。正确理解磁盘空间,RAM和地址空间之间的关系非常重要。

以下是它的确如何运作。

32位Windows上的每个进程都有一个4 GB的地址空间

在4 GB的地址空间中,2 GB是为使用操作系统而保留的,另外2 GB可供用户代码在其认为合适时使用。

现在让我在这一点上非常清楚:地址空间不是内存。一个进程可以拥有它想要的内存。我再说一遍:一个进程可以分配超过4 GB的内存。限制是只能将2 GB的内存映射到用户模式地址空间

我没有提到RAM,因为 RAM与地址空间问题无关。操作系统是将进程的内存存储在RAM中还是磁盘上或其他任何内容都无关紧要。 RAM只是一种性能优化,它允许操作系统将内存存储在快速芯片而不是慢速磁盘中。

您的进程告诉操作系统它想要多少内存,以及将该内存映射到2 GB地址空间的位置。如果进程需要超过2 GB的内存,那么它将无法将其全部映射到地址空间;需要巧妙地编写这样一个过程,以告诉操作系统从地址空间映射和取消映射哪些内存页,或者使用更少的内存。如果没有,那么它将因内存不足而失败。

也许类比会有所帮助。您的建筑有一个拥有一百个空间的停车场。那是RAM。街上有一个停车库,里面有一万个停车位。那是磁盘。您和建筑物中的每个人都有一个钥匙圈,上面有十个钥匙的空间。这是每个进程的地址空间。 您只有十把钥匙的空间是否意味着您只能拥有十辆车?不!您可以拥有任意数量的汽车,但是如果您想要访问其中的11辆汽车,您将不得不从密钥环中取出其中一把钥匙,将其存放在其他地方,并将新钥匙放在钥匙圈上。 这是将内存映射到地址空间和从地址空间中取出

如果大楼里的每个人都试图将十辆车停在RAM中怎么办?如果停车场满了,那么他们将不得不将这些车辆交换到街道上的停车场。 这会阻止他们在钥匙扣上放钥匙吗?不,显然不是。当他们想要驾驶一辆停在磁盘上的汽车时,它只会让它变慢。

如果有代客泊车服务能够找出人们更有可能使用的车辆,并将较少使用的车辆搬到街上的停车场,该怎么办? 这是内存管理器将最近使用较少的内存页放入交换文件中。

你指出你有一个大磁盘。假设您在该磁盘上有一个10 GB的文件。您当然可以在.NET程序中使用该文件的内容,但不能将其全部加载到连续的地址空间中。你必须以大块的形式阅读它。如果你很聪明,你可以一次将它映射到进程内存 - 你有足够的内存 - 但是你无法映射10 GB的< em> memory 进入2 GB的地址空间

一般来说,首先不要试图获得那么多记忆更容易;只需一次以几百KB的速度读取它。

人们将地址空间与物理内存混淆是极为常见的,但几十年来它们并不是一回事。有关详情,请参阅我关于此主题的文章 “Out Of Memory” Does Not Refer to Physical Memory

答案 1 :(得分:13)

Eric Lipperts的回答是100%正确的,您应该首先阅读,但我还有几件事需要补充:

  • 您可以使用所谓的/3G switch将2 GB用户模式地址空间限制增加到3 GB - 这是一个每台计算机设置,可以减少使用的地址空间操作系统为1 GB(从2 GB),释放额外的1 GB用于用户模式地址空间。
  • 如果您在64位操作系统下运行32位进程,则最大用户模式地址空间限制将增加到4 GB(即使您的应用程序编译为32位进程) - 这可能如果(例如)由于某些引用仍然只是32位而被限制为针对x86架构,则会非常有用。

请注意,上述解决方案的两者都要求设置IMAGE_FILE_LARGE_ADDRESS_AWARE标志。有关如何为.NET应用程序执行此操作的一些建议,请参阅 How do I create a (32-bit) .NET application to use 3 GB RAM?