我正在通过 mmap 实现持久的大型常量数组。使用 mmap 时是否有任何提示和技巧或注意事项?
问问题
705 次
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 回答