在 32 位机器中,每个进程都有一个 4GB 的虚拟空间。在这种情况下,人们可能会担心我们可能会因碎片化而遇到麻烦。但是在 64 位机器的情况下,理论上我们有一个巨大的可寻址虚拟内存,那么为什么内存碎片在 64 位机器中仍然是一个问题(如果是)?
最佳答案
您尝试访问的每个虚拟地址都由操作系统映射到物理内存。物理内存按页分配(例如 4K 大小)。如果您设法在偏移量 1000000*n 处分配一个字节,并为从 1 到 1000000 的 n 执行此操作(我认为您可以使用 mmap 执行此操作),那么操作系统将不得不用一百万来支持它pages 物理内存,大约 4G。该物理内存将无法用于其他任何用途。如果您连续分配了字节,那么您的百万字节只需要大约 1M 的物理内存(256 页)。
如果您出于正当理由分配 4G,然后取消分配其中的一部分,保留分配的每个页面的一部分,您可能会遇到类似的糟糕情况。操作系统实际上无法将释放的内存重新用于其他用途,因为没有完全空闲的物理页面。所以这是一个碎片化问题。
理论上,您可以想象虚拟地址 1000000 和 2000000 将映射到物理内存的同一页,从而避免碎片化。但实际上,出于充分的理由,虚拟内存映射是逐页完成的。您可以在这里阅读更多相关信息:http://en.wikipedia.org/wiki/Page_table .
关于c - 为什么内存碎片是 64 位机器上的一个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8542601/