我不是计算机专家,所以让我尝试更具体地提出这个问题:
我做了一些科学计算,计算有时需要大量内存来存储结果。几天前,我的输出文件占用了 4 GB 的硬盘空间,但我有这么大的 RAM。所以:
- 当您运行的程序分配的内存多于计算机中可用的内存时,CLR(或者是其他东西?)如何处理内存?它会在高清中创建一些交换吗? (我知道这可能会减慢我的程序,但我只对内存问题感兴趣)
- 它是否依赖于操作系统,比如我在 Linux 上使用 MONO 还是在 Windows 上使用 VS?
提前致谢!
我发现有帮助的思考方式是:memory是磁盘空间。RAM是一个快速缓存。我不认为“当我的 RAM 不足时,系统会将其交换到磁盘”,而是“当我有可用的 RAM 时,系统会将我的磁盘内存移入其中”。
这与大多数人的想法相反,但我发现它很有帮助。 RAM只是性能优化;可以分配多少内存的真正限制是可用磁盘空间。
当然,事情比这更复杂。在 32 位操作系统上,每个进程获得 20 亿字节用户地址空间。 (内核地址空间也是如此,但我们忽略这一点。)您可以访问的每一页内存,无论是在 RAM 中还是在磁盘上,都必须位于该地址空间中。您可以分配超过 20 亿字节,没有问题。但您一次只能寻址 2 GB。如果分配了 10 GB,则至少有 8 GB 将不会映射到地址空间。在这种情况下你必须unmap其他的东西,然后将你想要的东西映射到地址空间中以便获取它。
此外,还有很多东西需要在连续的地址空间。例如,如果您有一个 1MB 堆栈,则需要一百万个连续的地址空间中可用的字节数。
当人们“内存不足”时,他们并不是内存不足;而是内存不足。 RAM 只是磁盘上的快速缓存。而且它们并没有耗尽磁盘空间;有很多这样的。他们几乎总是处于没有足够的连续地址空间来满足需求的情况。
CLR 内存管理器不会为您实现这些奇特的映射和取消映射策略;基本上,您获得了 2GB 地址空间,仅此而已。如果您想做一些奇特的事情,例如使用内存映射文件,则需要您自己编写代码来管理内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)