gpt4 book ai didi

c - 如何从特定区域分配内存

转载 作者:太空狗 更新时间:2023-10-29 17:13:47 25 4
gpt4 key购买 nike

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

  • 进程间共享内存
  • 内存映射文件
  • 非 volatile 存储器

不是每次出现这种需求时都编写一次性堆实现,有没有办法重新使用 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 及其任何替代品都不能做到这一点。

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

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

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

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

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

关于c - 如何从特定区域分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48630711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com