【问题标题】:Why is memory fragmentation an issue on a 64-bit machine?为什么内存碎片在 64 位机器上是一个问题?
【发布时间】:2011-12-17 04:32:45
【问题描述】:

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

【问题讨论】:

  • 这在 64 位操作系统上不是问题。
  • 这条评论不应该是一个答案吗?现有答案似乎暗示这是 64 位的问题

标签: c memory-management memory-fragmentation


【解决方案1】:

您尝试访问的每个虚拟地址都由操作系统映射到物理内存。物理内存按页分配(例如 4K 大小)。如果您设法在偏移量 1000000*n 处分配一个字节,并为从 1 到 1000000 的 n 执行此操作(我认为您可以使用 mmap 做到这一点),那么操作系统将不得不用一百万来支持它pages 物理内存,类似于 4G。该物理内存将无法用于其他任何事情。如果您连续分配字节,则百万字节只需要大约 1M 的物理内存(256 页)。

如果您出于正当理由分配 4G,然后释放其中的一部分,保留每个分配的页面的一部分,您可能会遇到类似的糟糕情况。操作系统将无法实际将释放的内存重新用于其他任何事情,因为没有完全空闲的物理页面。所以这是一个碎片问题。

理论上,您可以想象虚拟地址 1000000 和 2000000 将映射到物理内存的同一页,从而避免碎片。但实际上,出于充分的理由,虚拟内存映射是逐页完成的。你可以在这里阅读更多信息:http://en.wikipedia.org/wiki/Page_table

【讨论】:

  • 既然 64 位有一个疯狂的虚拟地址空间,这些都不重要吗?除非你有 TB 的内存并继续使用 50TB 的容量?
  • 仔细阅读:它解释了为什么在碎片化时会浪费物理页面。
  • 是的,但问题是“为什么内存碎片在 64 位机器上是一个问题?”所以肯定答案的开头应该是“不是”?
  • 您没有抓住重点:内存碎片在 64 位机器上的问题与在 32 位机器上的问题一样大。位数决定了虚拟地址空间的可能大小,而内存碎片的危险是浪费物理内存(这在64位机器上是有限的)在 32 位上)。
  • 我很困惑,在 Windows 上,我认为这只是虚拟地址空间过于碎片化的问题,这在 64 位上几乎是不可能的
【解决方案2】:

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

虽然在某些情况下并不重要,但在这里或那里使用额外的兆字节并不会杀死您,但在更大的应用程序中这一切都会增加。这取决于情况,是否尽可能减少碎片是否重要,具体取决于您正在编码的内容或项目的目标。

【讨论】:

  • 但是“内存碎片”呢?对此的回应可能包括 malloc、操作系统和硬件因素如何分配和映射虚拟内存...
  • @pst 据我所知,这个问题只问了后果,而不是最初是如何发生的(尽管我可能读错了)。
猜你喜欢
  • 2011-04-15
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 2015-12-05
  • 2011-07-11
  • 2018-10-26
  • 2012-10-03
  • 2014-06-27
相关资源
最近更新 更多