2010-02-16 91 views
2

任何人都可以指向源代码或概述低碎片堆的算法是如何工作的吗?防止内存碎片

+1

这听起来像大多数人正在阅读的问题,“如何创建和分配最小碎片?”。但我认为作者的意思是“Windows的低碎片堆使用哪种算法?”这个问题的答案不会出现在简单的搜索中。 – 2010-02-16 21:38:15

回答

1

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

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

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

释放内存时,不要立即释放内存,但请保留一些块以备下一次分配。 仅当您有大量后续空闲块时,才将可用内存返回到操作系统。

这就是基本的想法。其余的是实现池(通常是链表的块)。

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

  • 如果你还在使用malloc /免费,使用#定义的重新定义malloc和free
  • 如果您使用新/删除,定义全局new和delete操作

而且看看How to solve Memory Fragmentation,并且在Memory management in memory intensive application

1

我的评论从MSDN

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

这个策略被许多内存管理器使用,虽然细节可能会有所不同。