【问题标题】:Prevent memory fragmentation防止内存碎片
【发布时间】:2011-01-17 14:14:25
【问题描述】:

谁能指出一个来源或概述低碎片堆的算法是如何工作的?

【问题讨论】:

  • 听起来大多数人都在将这个问题解读为“如何创建和分配碎片最少的分配器?”。但我认为作者的意思是,“Windows 的 Low-Fragmentation Heap 使用哪种算法?”这个问题的答案不是通过简单的搜索就能找到的。

标签: c++ windows memory


【解决方案1】:

首先决定要为分配的内存块使用哪些“倍数”。我通常使用 8 个字节。

在应用程序启动时,创建一个向量,其中向量中的每个元素都指向一个内存块“池”。向量中的第一个索引将用于 8 字节或更少的内存分配。向量中的第二个索引将用于 9-16 字节的内存分配,依此类推。

在每个池中,以更大的块分配内存。例如。在分配 8 个字节(或更少)的池中,不分配 8 个字节,而是分配 N 次 8 个字节。在池中记住哪些部分在应用程序中真正分配,哪些部分只是等待分配。

释放内存时,不要立即释放它,而是保留一些块为下一次分配该大小的内存做好准备。 仅当您有很多后续空闲块时,才将空闲内存返回给操作系统。

这是基本思想。剩下的就是实现池(通常是块的链表)。

困难的部分是将堆实现集成到应用程序中。

  • 如果您仍在使用 malloc/free,请使用 #define 重新定义 malloc 和 free
  • 如果您使用 new/delete,请定义全局 new 和 delete 运算符

还可以看看How to solve Memory Fragmentation,以及我在Memory management in memory intensive application的评论

【讨论】:

    【解决方案2】:

    来自MSDN

    LFH 不是一个单独的堆。相反,它是应用程序可以为其堆启用的策略。当启用 LFH 时,系统会以某些预定大小分配内存。当应用程序从启用了 LFH 的堆请求内存分配时,系统会分配足够大以包含请求大小的最小内存块。

    许多内存管理器都使用此策略,但细节可能会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-07
      • 2013-03-12
      • 2013-08-14
      • 2010-10-26
      • 1970-01-01
      • 2018-09-25
      • 2012-12-11
      • 2020-02-15
      相关资源
      最近更新 更多