首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一个malloc实现可以在自己的堆之外进行记账?

是否有一个malloc实现可以在自己的堆之外进行记账?
EN

Stack Overflow用户
提问于 2010-12-17 08:54:59
回答 5查看 1.3K关注 0票数 6

我需要管理一个内存堆,约束是这个内存只能写,不能读,也就是说,malloc实现应该将记账信息与它管理的堆分开保存,放在普通的堆上,并且实际上永远不应该接触它管理的特定堆。我希望使用经过测试、优化的现成解决方案,如果可以的话。使用的例子包括嵌入式系统的外部单元上的OpenGL、VBO和存储器。

我看了一眼dlmalloc,从文档中看,它似乎用记账信息标记了它从两端分配的内存块。谷歌搜索也没有任何好处-也许我没有正确的关键字来找到我正在寻找的东西。

说明:作为一个单独的堆,我的意思是我所定义的堆。我希望在一个或少量预分配块中使用分配较小的内存。我甚至不关心记账信息(在这样的托管堆之外)是否比内部的数据大:)此外,应用程序本身将使用股票malloc和堆进行操作,并且只将这些块用于特殊目的,这归结为用于与外部硬件通信的内存区,其中来自应用程序的写入是目的,读取是不可能的或昂贵的。这不是一个一般性的malloc问题,我只是希望利用一些已经进行了大量研究和测试的东西。

EN

回答 5

Stack Overflow用户

发布于 2010-12-17 21:54:29

它并不是一个现成可用的库,但是Linux内核中的resource management代码确实做到了这一点,以管理诸如PCI地址空间之类的资源。

票数 1
EN

Stack Overflow用户

发布于 2010-12-17 11:21:46

下面是一个非常简单的malloc实现,它从不将记账信息写入它管理的堆中:

代码语言:javascript
复制
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相同的原则,但不是将数据存储在空闲块中,而是对块的地址执行散列,以便从散列箱中获取其记账信息。然而,任何这种不在实际堆中存储信息的方法的一个大问题是,释放内存可能会矛盾地增加正在使用的内存量(由于需要分配新的记账结构)。

票数 0
EN

Stack Overflow用户

发布于 2010-12-17 17:37:47

实现可能是相当简单的实现。不将元数据与分配的块一起存储的一个缺点是,free()的性能可能较慢且不确定。但是由于malloc()已经有了这个问题,也许这并不是真正的问题。

一种简单的确定性解决方案是实现固定块内存分配器,其中从常规堆中分配固定大小的块,并将指向每个块的指针放置在队列或链表上。要分配一个块,只需从空闲块队列/列表中获取一个指针,然后将该指针放回空闲块列表中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4466817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档