我需要管理一个内存堆,约束是这个内存只能写,不能读,也就是说,malloc实现应该将记账信息与它管理的堆分开保存,放在普通的堆上,并且实际上永远不应该接触它管理的特定堆。我希望使用经过测试、优化的现成解决方案,如果可以的话。使用的例子包括嵌入式系统的外部单元上的OpenGL、VBO和存储器。
我看了一眼dlmalloc,从文档中看,它似乎用记账信息标记了它从两端分配的内存块。谷歌搜索也没有任何好处-也许我没有正确的关键字来找到我正在寻找的东西。
说明:作为一个单独的堆,我的意思是我所定义的堆。我希望在一个或少量预分配块中使用分配较小的内存。我甚至不关心记账信息(在这样的托管堆之外)是否比内部的数据大:)此外,应用程序本身将使用股票malloc和堆进行操作,并且只将这些块用于特殊目的,这归结为用于与外部硬件通信的内存区,其中来自应用程序的写入是目的,读取是不可能的或昂贵的。这不是一个一般性的malloc问题,我只是希望利用一些已经进行了大量研究和测试的东西。
发布于 2010-12-17 21:54:29
它并不是一个现成可用的库,但是Linux内核中的resource management代码确实做到了这一点,以管理诸如PCI地址空间之类的资源。
发布于 2010-12-17 11:21:46
下面是一个非常简单的malloc实现,它从不将记账信息写入它管理的堆中:
void *malloc(size_t n) { return sbrk(n); }
void free(void *p) { }
void *realloc(void *p, size_t n }
{
void *q = malloc(n);
if (q) memcpy(q, p, n);
return q;
}如果你想要一些更现实的想法,一个简单的解决方案是选择一个最小的内存单元进行分配(8或16字节可能是合理的),并将托管堆划分为此大小的单元,然后将哪些是空闲的存储在位图中(例如,每16字节一位,开销为1/128,<1% )。搜索空闲空间就是O(n),但是你可以想办法用多尺度地图来改进它。
另一个想法是使用与dlmalloc相同的原则,但不是将数据存储在空闲块中,而是对块的地址执行散列,以便从散列箱中获取其记账信息。然而,任何这种不在实际堆中存储信息的方法的一个大问题是,释放内存可能会矛盾地增加正在使用的内存量(由于需要分配新的记账结构)。
发布于 2010-12-17 17:37:47
实现可能是相当简单的实现。不将元数据与分配的块一起存储的一个缺点是,free()的性能可能较慢且不确定。但是由于malloc()已经有了这个问题,也许这并不是真正的问题。
一种简单的确定性解决方案是实现固定块内存分配器,其中从常规堆中分配固定大小的块,并将指向每个块的指针放置在队列或链表上。要分配一个块,只需从空闲块队列/列表中获取一个指针,然后将该指针放回空闲块列表中。
https://stackoverflow.com/questions/4466817
复制相似问题