2010-02-16 110 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的堆中請求內存分配時,系統會分配足夠大的最小內存塊以包含所請求的大小。

這個策略被許多內存管理器使用,雖然細節可能會有所不同。