2009-02-24 37 views
0

我已經編寫了用於堆分配的ac/C++內存管理器(基於Doug Lea的malloc重載new/delete和malloc/realloc/free,但設計爲等待免費),並似乎有一些分裂的麻煩。那裏有沒有什麼好的資源能夠詳細說明避免經理人分裂的好策略?在自定義內存管理器中對抗碎片

請注意,我無法重新排列已分配的內存(不使用帶GUID的智能指針),並且重新編寫系統以使用池而不是堆分配是不可行的。

感謝,
格蘭特

+0

順便說一句,你如何讓dlmalloc在沒有大的重寫的情況下等待?我可以理解使用SLIST(原子列表)原語免費使用dlmalloc lock中的小分配,因爲它們只是大小合併的freelists,但waitfree有點困難。另外,如果您正在使用無鎖和免等待方法修剪(返回內存到操作系統),則必須非常小心,除非您使用危險指針或垃圾回收來避免可以解引用鏈接節點的競爭條件釋放回操作系統。 – Adisak 2009-10-26 00:13:21

+0

該系統只是基於Doug Lea的概念(不想通過並學習代碼然後改變它),但是如果您爲每個線程分配自己的bin和blocks(如果您只是嘗試單獨執行bin ,那麼將連續的內存塊組合在一起時會出現問題),那麼分配函數已經等待空閒。所有你需要做的就是以一種無等待的方式來處理釋放(我通過將它們全部放入列表中以便被所有者線程正確釋放)來處理釋放。 – 2009-10-26 03:44:23

回答

0

看看像glibc這樣更成熟的項目是如何做到的。

快速谷歌發現this,與一堆引用。