如何从特定区域分配内存

68e*_*669 8 c malloc memory-management

通常,可以使用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);
Run Code Online (Sandbox Code Playgroud)

Jos*_*hua 1

不,那不存在。无论malloc是它的替代品还是任何替代品都无法做到这一点。

那么,现在让我们来看看为什么这个东西不存在。

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

内存映射文件也是如此。对于内存映射文件,通常文件格式仍然定义良好,并且其中不会有堆管理器之类的东西,如果有的话,它将由文件格式完全指定,您可能会在库中找到该东西该文件格式,但嵌入式堆管理器永远无法工作。如果您开始谈论内存映射文件中的堆管理器,我认为您正在开发数据库引擎,并且您将发现堆管理需要与 RAM 中堆管理有很大不同,因为磁盘寻道时间太可怕了。

我想您可以将堆管理器用于深度嵌入式系统的非易失性内存,但大多数系统使用更简单的 NVRAM 技术,始终是静态分配的。我的直觉是通用堆管理器是一个糟糕的选择,而解决问题的专用管理器要好得多,以至于没有人真正考虑通用堆管理器。

如果您确实找到了一个将内存区域用作堆的通用堆库,那么它仍然对您来说效果不佳。共享内存和内存映射文件必须处理任意两条指令之间的进程崩溃;因此根本无法使用正常的锁定。有一些专门用于共享内存的锁。内存映射IO的问题更严重,我可以证明锁不可能存在,因为并发模型太糟糕了。