我正在寻找有关如何在我的库中透明且健全地处理对大型(定义为:大于可寻址内存)文件/块设备的访问的帮助。假设我们在 32 位架构上有一个大小为 512GB 的块设备。512GB 比我们在 32 位架构上所能解决的要多得多,并且使用管理内存中的设备/文件的部分mmap()
是我试图避免的事情。
我想要实现的是,获取被寻址为 64 位数字/偏移量的块,这些块是任意的,但每个设备的大小是静态的(512 字节、4K、8K、64MB 等)。调用者应该只获取内存地址,不需要关心释放内存或将实际内容加载到内存中。
我在想一个机制如下:
- 类似于
void* get_file_address(unit64_t blk_offset)
获取偏移量(块号)的调用,并检查该块是否已经映射,如果没有读入并因此映射它 - 一些跟踪块访问计数的结构(在每次
get_file_address
调用时更新) - 一个内存管理器,可以在内存不足时使用,并开始使用前面提到的结构卸载很少使用的块
最后一点让我很恼火:自己编写内存管理器似乎并不理智。此外,我确信我不是第一个遇到这个问题的人。
那么是否有任何解决方案/库/代码片段已经有助于管理此类或类似情况?我对 Win、Linux、*BSD 或 OS X 的解决方案很满意。