【问题标题】:How to allocate memory from specific region如何从特定区域分配内存
【发布时间】:2018-02-05 20:12:05
【问题描述】:

通常,可以使用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);

【问题讨论】:

  • 我认为你不能重复使用malloc。我可能错了,但我相信您需要为此实现自己的功能。
  • 一些内存区域是可写的,不需要malloc。在某些平台上有一个“绝对分配”调用,而在其他一些平台上,共享内存是可写的,但您需要一个约定(信号量)以确保您不会同时写入
  • 你使用的是什么操作系统?
  • 显然所有这些类型的内存都可以直接读/写。问题是是否可以重用众所周知的分配器来跟踪它。我更新了问题以澄清这一点。
  • 问题超出了“malloc() 可以做到这一点吗?” (它不能),这似乎归结为第三方库的推荐请求。恐怕这样的要求在这里是题外话。

标签: c memory-management malloc


【解决方案1】:

不,那不存在。 malloc 和它的任何替代品都不能做到这一点。

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

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

内存映射文件也是如此。对于内存映射文件,通常文件格式仍然是非常明确的,并且没有像堆管理器这样的东西,如果有的话,文件格式将完全指定它,你可能会在库中找到它这种文件格式,但一个插入式堆管理器永远不会工作。如果您开始谈论内存映射文件中的堆管理器,我认为您正在开发数据库引擎,并且您将发现堆管理需要与 RAM 中的堆管理非常不同,因为磁盘寻道时间太可怕了。

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

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

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 2013-05-22
    • 2013-09-30
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2021-04-18
    相关资源
    最近更新 更多