进程地址空间告诉我,我的.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.
人们将地址空间与物理内存混淆是极为常见的,但几十年来它们并不是一回事.有关更多详细信息,请参阅我关于此主题的文章,"内存不足"不涉及物理内存.
Jus*_*tin 13
Eric Lipperts的回答是100%正确的,您应该首先阅读,但我有几件事需要补充:
注意,上述两种解决方案都要求IMAGE_FILE_LARGE_ADDRESS_AWARE设置标志.请参阅如何创建(32位).NET应用程序以使用3 GB RAM?有关如何为.NET应用程序执行此操作的一些建议.
| 归档时间: |
|
| 查看次数: |
3939 次 |
| 最近记录: |