我正在创建一个 CMA(连续内存分配器)用户端驱动程序,并且我映射了一些空间区域。如果我创建第二个对象,它想要映射相同的内存区域,是否可以搜索它已经被映射并传回该地址?目前,每个对象都会制作自己的 mmap,它可以工作,但就性能而言这是个好主意吗?
该类用于映射不同的内存区域,具体取决于构造函数中传递的内容,因此静态将不起作用。
最佳答案
我不是 100% 确定您想要实现什么,但我猜您想要优化分配,以便在同一应用程序中多次使用同一区域时减少开销。
内核需要跟踪对物理内存页的每次引用,因此如果您在代码中“跟踪分配并返回相同的指针”,您将需要自己对分配进行引用计数,并且只进行分配/释放在需要的时候。
我会在用户模式级别执行它,基本上保留一个 std::map
(或类似的),它以底层内存和大小为键,然后对该分配进行引用计数,并且只有在引用计数为零时才调用 munmap
(当然只有在找不到该区域时才调用 mmap
)。如果您对同一区域有多个不同大小的分配,它会变得更“有趣”,但我认为没有一种方法可以(很好地)为此实现 - 至少如果第二次调用请求更大的分配。
在用户模式下这样做的好处是显而易见的:如果您在记帐中犯了错误,内核仍然会在应用程序停止时释放内存。并且在内核模式下为 std::map
[或其等价物] 分配内存也将更难处理。
关于c++ - 多个对象的 MMAP 共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37507421/