c++ - 多个对象的 MMAP 共享

标签 c++ linux mmap

我正在创建一个 CMA(连续内存分配器)用户端驱动程序,并且我映射了一些空间区域。如果我创建第二个对象,它想要映射相同的内存区域,是否可以搜索它已经被映射并传回该地址?目前,每个对象都会制作自己的 mmap,它可以工作,但就性能而言这是个好主意吗?

该类用于映射不同的内存区域,具体取决于构造函数中传递的内容,因此静态将不起作用。

最佳答案

我不是 100% 确定您想要实现什么,但我猜您想要优化分配,以便在同一应用程序中多次使用同一区域时减少开销。

内核需要跟踪对物理内存页的每次引用,因此如果您在代码中“跟踪分配并返回相同的指针”,您将需要自己对分配进行引用计数,并且只进行分配/释放在需要的时候。

我会在用户模式级别执行它,基本上保留一个 std::map (或类似的),它以底层内存和大小为键,然后对该分配进行引用计数,并且只有在引用计数为零时才调用 munmap(当然只有在找不到该区域时才调用 mmap)。如果您对同一区域有多个不同大小的分配,它会变得更“有趣”,但我认为没有一种方法可以(很好地)为此实现 - 至少如果第二次调用请求更大的分配。

在用户模式下这样做的好处是显而易见的:如果您在记帐中犯了错误,内核仍然会在应用程序停止时释放内存。并且在内核模式下为 std::map [或其等价物] 分配内存也将更难处理。

关于c++ - 多个对象的 MMAP 共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37507421/

相关文章:

c++ - 为什么这个 Makefile 无法构建项目?

c++ - float 增加 UI 的精度问题

java - 指定Java内存分配池地址

c++ - 正确使用GetLongPathName函数

c++ - 将 std::vector v 传递给需要在相应实例的整个生命周期内访问 v 的类的构造函数

php - php 中的数据库连接与 linux 主机上的 MS Access

Linux USB驱动probe()问题

linux - 无法创建次设备号为 0 和 1 的设备

c - struct 和 mmap 有什么问题

c++ - 如何内存映射一个巨大的矩阵?