【发布时间】:2009-07-27 11:03:51
【问题描述】:
我正在通过 mmap 实现持久的大型常量数组。使用 mmap 时是否有任何提示和技巧或注意事项?
【问题讨论】:
我正在通过 mmap 实现持久的大型常量数组。使用 mmap 时是否有任何提示和技巧或注意事项?
【问题讨论】:
存储在 mmap'd 区域内的所有指针都应作为距 mmap'd 区域基址的偏移量,而不是真正的指针!当您在下次运行程序时对该区域进行映射时,您不一定会获得相同的基地址。 (我不得不清理那些对 mmap 区域基地址恒定性做出错误假设的代码)。
【讨论】:
这是 mmap() 最直接的用例,所以应该不会有太多问题。
您实际上只是在加载一个大型常量数组。作为常量,您不必担心同步。建议确保 prot 参数仅设置为 PROT_READ,因为您不会写入。
如果要持续运行一个或多个使用常量的程序,那么有一个单独的程序来加载数据并使其保持常驻可能是值得的。其他程序的运行基本上只是进行共享内存附加,而不是不断地将文件读入内存。
【讨论】:
确保检查打开文件大小或内存使用的限制。在 Linux 上,有一个内置的 shell 命令 ulimit。以ulimit -a 运行以查看当前设置。
使用 msync(2) 系统调用将内存中数组的写入刷新到文件中,否则它们可能会一直保留在内存中直到 munmap(2),并且在此之前可能会出现断电或其他情况!
如果多个进程正在映射以读写权限共享的同一内存区域,请确保一次只有一个进程在写入,以避免损坏您的数据。或者使用文件锁定或其他一些同步方式。
【讨论】: