1

我正在通过 mmap 实现持久的大型常量数组。使用 mmap 时是否有任何提示和技巧或注意事项?

4

3 回答 3

4

存储在 mmap 区域内的所有指针都应作为距 mmap 区域基址的偏移量,而不是真正的指针!当您在下次运行程序时对该区域进行映射时,您不一定会获得相同的基地址。(我不得不清理那些对 mmap 区域基地址恒定性做出错误假设的代码)。

于 2009-07-27T14:53:38.883 回答
3

确保检查对打开文件大小或内存使用的限制。在 Linux 上,有一个内置的 shell 命令 ulimit。运行ulimit -a方式查看当前设置。

使用 msync(2) 系统调用将内存中数组的写入刷新到文件中,否则它们可能会一直留在内存中直到 munmap(2) 并且在此之前可能会出现断电或其他情况!

如果多个进程正在映射以读写权限共享的同一内存区域,请确保一次只有一个进程在写入,以避免损坏您的数据。或者使用文件锁定或其他一些同步方式。

于 2009-07-27T11:39:39.463 回答
3

这是 mmap() 最直接的用例,所以应该不会有太多的问题。

您实际上只是在加载一个大型常量数组。作为常量,您不必担心同步。建议确保prot参数仅设置为 PROT_READ,因为您不会写入。

如果要连续运行一个或多个使用常量的程序,那么有一个单独的程序来加载数据并使其保持驻留可能是值得的。其他程序的运行基本上只是进行共享内存附加,而不是不断地将文件读入内存。

于 2009-07-27T15:18:38.310 回答