用地址访问一段文件

Linux的mmap可把文件中从某个偏移开始的区域映射到进程地址空间,并设置读取、写入或执行保护。程序随后通过相应地址访问内容,不必为每一次读取都显式调用read。

映射仍受页面和权限规则约束。建立映射并不意味着所有页面已经常驻内存,也不取消后续缺页处理。mmap成功后关闭原文件描述符,一般不会因此使已建立的映射失效。

参考:[1]

共享与私有映射效果不同

MAP_SHARED使修改对映射同一区域的其他进程可见,并按规则写回底层文件。MAP_PRIVATE则建立私有写时复制语义,修改不会作为该映射的写入传到原文件或其他映射进程。

可见性不等于并发访问已经安全。共享同一内容的程序仍需适当同步,避免一方读取到应用不允许的中间状态;映射本身并未把任意多步内存更新组成数据库事务。

参考:[1]

写回与访问边界需核对

Linux的msync可请求把相应内存修改同步回文件,MS_SYNC等待指定更新完成,MS_ASYNC有不同返回语义。写进映射、内容对其他进程可见和已经满足持久化要求,应按接口分别判断。

访问映射文件结尾以外的页面还可能触发SIGBUS等错误;文件大小变化与映射长度也需协调。因此内存映射提供一种访问机制,不能消除存储错误、范围检查与恢复设计。

参考:[2] [1]