为什么64位机器上的内存碎片成为问题?

12
在32位机器上,每个进程都会获得4GB的虚拟空间。在这种情况下,人们可能会担心由于内存碎片而遇到麻烦。但是,在64位机器上,我们在理论上有一个巨大的可寻址虚拟内存,所以为什么内存碎片仍然是一个问题呢(如果是的话)?

2
64位操作系统上不是问题。 - Hans Passant
1
这个评论不应该是一个答案吗?现有的答案似乎暗示它是64位中的一个问题。 - paulm
2个回答

9
每个您尝试访问的虚拟地址都会被操作系统映射到物理内存中。物理内存以页面(例如4K大小)分配。如果您成功分配了偏移量为1000000 * n的一字节,并对n从1到1000000进行操作(我想您可以使用mmap完成此操作),那么操作系统将不得不用100万“页面”物理内存来反向支持,大约为4G。这些物理内存将不可用于其他任何用途。如果您连续地分配了这些字节,则只需要大约1M的物理内存(256页)来容纳您的100万个字节。
如果出于合法原因分配了4G空间,然后删除其中一部分,只保留每个页面的一小部分,则可能会遇到类似的问题。由于没有完全空闲的物理页面,操作系统无法实际重复使用释放的内存。这是一个碎片化问题。
理论上,您可以想象虚拟地址1000000和2000000将映射到相同的物理内存页面,从而避免碎片化。但在实践中,虚拟内存映射是基于页面的基础进行的,并有充分的理由。您可以在此处阅读更多相关信息:http://en.wikipedia.org/wiki/Page_table

既然64位有一个疯狂的虚拟地址空间,那么这些都无关紧要了吗?除非你有TB级别的内存并且一直使用50TB这样的量级? - paulm
1
请仔细阅读:它解释了为什么在出现碎片化时会浪费物理页面。 - DS.
是的,但问题是“为什么在64位机器上内存碎片化是一个问题?”所以答案的开头肯定应该是“不是”。 - paulm
你没有理解重点:内存碎片化在64位机器上和32位机器上一样严重。位数决定了虚拟地址空间的可能大小,而内存碎片化的危险是浪费物理内存(在64位机器上和32位机器上一样有限)。 - DS.
我感到困惑,在Windows上我认为只有在虚拟地址空间过于碎片化时才会出现问题,而这在64位系统上几乎是不可能的。 - paulm

0

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

然而,有些情况下实际上并不重要,使用额外的一兆字节或者更多并不会对你造成致命的后果,但在更大的应用程序中所有这些都会累加。具体情况取决于你编写代码的目的或项目的目的,是否有必要尽可能地减少碎片化。


但是“内存碎片化”怎么办?对此的回应可能涉及如何将malloc、操作系统和硬件因素纳入到分配和映射虚拟内存中... - user166390
@pst 从我理解的问题来看,似乎只是在询问后果,而不是事情是如何发生的(虽然我可能读错了)。 - Jesus Ramos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接