2 GB真的是我最大的吗?

Bit*_*tes 36 .net c#

进程地址空间告诉我,我的.NET应用程序最多只能在Windows XP上使用2 GB.真的吗?

但是,如果我有一个20 TB的硬盘驱动器怎么办?它是不是可以使用一些驱动器空间?

Eri*_*ert 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的内存映射到2 GB的地址空间.

一般来说,最好不要试图获得那么多的记忆; 一次只能读几百KB.

人们将地址空间与物理内存混淆是极为常见的,但几十年来它们并不是一回事.有关更多详细信息,请参阅我关于此主题的文章,"内存不足"不涉及物理内存.

  • 如果可以的话,我会赞成你的回答! (5认同)

Jus*_*tin 13

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

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

注意,上述两种解决方案都要求IMAGE_FILE_LARGE_ADDRESS_AWARE设置标志.请参阅如何创建(32位).NET应用程序以使用3 GB RAM?有关如何为.NET应用程序执行此操作的一些建议.

  • 嘿! 你不是我! (2认同)