为什么64位计算机上存在内存碎片问题?

时间:2011-12-17 04:32:46

标签: c memory-management memory-fragmentation

在32位计算机中,每个进程获得4GB虚拟空间。在这种情况下,人们可能会担心我们可能会因为碎片而面临麻烦。但是在64位机器的情况下,我们理论上有一个巨大的可寻址虚拟内存,那么为什么内存碎片仍然是一个问题(如果是)在64位机器上?

2 个答案:

答案 0 :(得分:6)

您尝试访问的每个虚拟地址都由操作系统映射到物理内存。物理内存以页面分配(例如4K大小)。如果你设法在偏移量1000000 * n处分配一个字节,并且从1到1000000为n做(我认为可能使用mmap执行此操作),那么操作系统将不得不支持100万物理内存的页面,就像4G一样。其他物理内存将无法使用。如果你已经连续分配了字节,那么你的百万字节只需要大约1M的物理内存(256页)。

如果您出于合法原因分配4G,则会遇到类似的不良情况,然后取消分配部分内容,保留每个页面的分配。操作系统无法将释放的内存重新用于其他任何内容,因为没有完全免费的物理页面。所以这是一个碎片问题。

理论上,您可以想象虚拟地址1000000和2000000将映射到同一页物理内存,从而避免碎片。但在实践中,并且出于好的理由,虚拟内存映射是逐页完成的。您可以在此处详细了解:http://en.wikipedia.org/wiki/Page_table

答案 1 :(得分:0)

因为所有内存都被“浪费”,所以考虑一个你有很多内部碎片的应用程序。该过程需要更多内存页面,因为工作集现在分散在内存中,这意味着它的内存占用空间要高得多。如果这个应用程序争夺RAM中的物理插槽(机器仍然只有大约4-8 GB的RAM用于典型的家庭设置),那么它会导致更多的页面交换。通常,您希望减少应用程序的内存占用,以避免内存压力和与其他应用程序的争用。

虽然有些情况并不重要,但在这里或那里使用额外的兆字节并不会让你失望,但它们在大型应用程序中都会增加。取决于你编码的内容或项目的目标是什么,尽可能少碎片是很重要的。