【发布时间】:2011-01-17 14:14:25
【问题描述】:
谁能指出一个来源或概述低碎片堆的算法是如何工作的?
【问题讨论】:
-
听起来大多数人都在将这个问题解读为“如何创建和分配碎片最少的分配器?”。但我认为作者的意思是,“Windows 的 Low-Fragmentation Heap 使用哪种算法?”这个问题的答案不是通过简单的搜索就能找到的。
谁能指出一个来源或概述低碎片堆的算法是如何工作的?
【问题讨论】:
首先决定要为分配的内存块使用哪些“倍数”。我通常使用 8 个字节。
在应用程序启动时,创建一个向量,其中向量中的每个元素都指向一个内存块“池”。向量中的第一个索引将用于 8 字节或更少的内存分配。向量中的第二个索引将用于 9-16 字节的内存分配,依此类推。
在每个池中,以更大的块分配内存。例如。在分配 8 个字节(或更少)的池中,不分配 8 个字节,而是分配 N 次 8 个字节。在池中记住哪些部分在应用程序中真正分配,哪些部分只是等待分配。
释放内存时,不要立即释放它,而是保留一些块为下一次分配该大小的内存做好准备。 仅当您有很多后续空闲块时,才将空闲内存返回给操作系统。
这是基本思想。剩下的就是实现池(通常是块的链表)。
困难的部分是将堆实现集成到应用程序中。
还可以看看How to solve Memory Fragmentation,以及我在Memory management in memory intensive application的评论
【讨论】:
来自MSDN:
LFH 不是一个单独的堆。相反,它是应用程序可以为其堆启用的策略。当启用 LFH 时,系统会以某些预定大小分配内存。当应用程序从启用了 LFH 的堆请求内存分配时,系统会分配足够大以包含请求大小的最小内存块。
许多内存管理器都使用此策略,但细节可能会有所不同。
【讨论】: