我正在通过mmap实现持久性大型常量数组。使用mmap时是否应该注意任何提示和技巧或陷阱?
答案 0 :(得分:4)
存储在mmap'd区域内的所有指针都应该作为mmap'd区域基础的偏移量完成,而不是真正的指针!在下次运行程序时映射区域时,不一定会获得相同的基址。 (我不得不清理对mmap区域基地址恒定性做出错误假设的代码。)
答案 1 :(得分:3)
确保检查打开文件大小或内存使用情况的限制。在Linux上有一个内置的shell命令ulimit。以ulimit -a
运行以查看当前设置。
Flush使用msync(2)系统调用将内存数组写入文件,否则它们可能会留在内存中直到munmap(2),并且可能会出现断电或之前的事情!
如果多个进程正在使用读写权限共享相同的内存区域,请确保每次只写入一个以避免损坏数据。或者使用文件锁定或其他一些同步方式。
答案 2 :(得分:3)
这是mmap()最直接的用例,所以不应该有太多让你失望的事。
您实际上只是加载一个大型常量数组。作为常量,您不必担心同步。建议确保 prot 参数仅设置为PROT_READ,因为您不会写。
如果要继续运行一个或多个使用常量的程序,则可能需要一个单独的程序来加载数据并使其保持驻留状态。然后,其他程序的运行基本上只是执行共享内存连接,而不是不断地将文件读入内存。