2009-02-24 59 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,与一堆引用。