如何从特定区域分配内存

时间:2018-02-05 20:12:06

标签: c memory-management malloc

通常,可以使用mallocfree函数以实现定义的方式分配内存。但是,通常需要管理来自特定区域的内存分配。例子包括:

  • 进程间共享内存
  • 内存映射文件
  • 非易失性存储器

每次出现此要求时,有没有办法重用malloc来管理这些区域(Linux),而不是编写一次性堆实现?否则,任何"众所周知的"内存分配器(例如dmalloc,ptmalloc等)是否支持从特定区域分配?

示例:

void *pool = mmap(/* my file */);
void *pool_manager = mallloc_init(pool, /* size */);
void *p = malloc_ex(pool, 1024);
free_ex(pool, p);

1 个答案:

答案 0 :(得分:0)

否,不存在。 malloc或其任何替代产品都无法做到这一点。

所以,让我们现在了解为什么这种东西不存在。

进程间共享内存的确在进程之间共享,但是在不同进程中的不同地址共享,因此传统的堆管理器根本无法工作,并且使用专用协议在使用指针以外的事物的进程之间进行通信(因为指针不能跨进程工作,因为地址不同。

内存映射文件也是如此。对于内存映射文件,通常文件格式仍然定义非常明确,没有像堆管理器那样的内容,如果有,文件格式将完全指定该格式,那么您可能会在库中找到用于该文件格式,但嵌入式堆管理器将永远无法工作。如果您开始谈论内存映射文件中的堆管理器,那么我认为您正在开发数据库引擎,并且您将发现堆管理与RAM内堆管理非常不同,因为磁盘查找时间太可怕了。

我想您可以为深度嵌入式系统的非易失性存储器使用堆管理器,但是大多数使用远比NVRAM更简单的技术的堆管理器始终是静态分配的。我的直觉是,一般的堆管理器是一个糟糕的选择,而对此问题进行调适的专业经理则要好得多,以至于没有人真正考虑使用通用堆管理器。

如果您确实找到了将内存区域用作堆的通用堆库,那么它仍然对您不利。共享内存和内存映射文件必须处理任何两条指令之间的崩溃过程;因此根本不能使用普通锁定。有用于共享内存的专用锁。内存映射IO的问题更加严重,我可以证明由于并发模型太糟糕而导致锁不存在。