第九十五章:共享内存与内存映射
复习
- 页面缓存把文件内容作为内存中的页保存。
TL;DR
- 内存映射把文件内容安排进进程地址空间。
- 共享内存让多个进程映射同一批物理页。
正文
既然文件缓存本来就是页面,内核可以把文件的某一段映射到进程的虚拟地址空间。程序随后像读写普通数组一样读写那段地址;第一次访问仍可能缺页,修改后的页也仍按文件系统规则写回。这就是内存映射。
若两个进程把同一批物理页映射到自己的地址空间,就得到共享内存。传递大块数据时,它避免了反复复制;代价是两个进程仍要用锁、条件变量等机制规定读写顺序。
文件、缓存和页表已经连成一张图。可一旦断电恰好发生在多处元数据更新之间,磁盘上会留下什么?
思考题
共享内存为什么不自动保证两个进程看到一致结果?
小结
- 内存映射把文件访问和虚拟内存统一起来。
- 共享页面传递数据很快,仍需同步。
思考题答案(仅供参考)
共享只意味着看见同一批字节,不会替两个进程安排读写的先后顺序。
协议
本文采用 CC BY-NC-SA 4.0 协议发布。