关于boost::iostreams::mapped_file写入时缺页异常的技术问询
关于
boost::iostreams::mapped_file写入时触发轻微缺页的解析 问题场景回顾
你通过boost::iostreams::mapped_file完成的测试流程:
- 磁盘上有一个1页(4096字节)的文件,以
readwrite模式创建映射 - 读取第一个字节,触发预期的缺页异常
- 重复读取,无缺页,符合预期
- 写入1个字节,出现1次轻微缺页,存在困惑
- 再次写入,无缺页,符合预期
核心原因解析:权限变更与写时复制(COW)
步骤4的轻微缺页并非因为页不在物理内存,而是内核需要处理虚拟页的权限变更或写时复制逻辑,属于"软缺页"(minor page fault),不需要从磁盘加载数据:
步骤2后的页状态
当你第一次读取映射页时,内核会将磁盘文件加载到页缓存C,并将进程虚拟内存V映射到C,但此时虚拟页的权限是只读的——内核默认以只读权限映射页缓存,目的是避免无限制的直接修改影响缓存一致性。第一次写入时的内核操作
当你首次尝试写入V时,CPU会触发权限异常,内核需要介入处理:- 若为
PRIVATE映射:内核会复制页缓存C到新的物理页C',将V重新映射到C',并把V的权限改为可写。这个内存内的复制操作会触发一次轻微缺页。 - 若为
SHARED映射:内核会检查页缓存C是否与磁盘内容一致(干净页),确认后直接将V的权限改为可写,允许后续写入直接修改C。这个权限变更的页表更新操作同样会触发轻微缺页。
- 若为
第二次写入无缺页的原因
第一次写入后,虚拟页的权限已经变为可写,后续写入无需再触发内核的权限或复制逻辑,因此不会产生缺页。
关于映射类型与页缓存的关系
你的假设基本正确,但需要明确映射类型的差异:
- 步骤2后,进程虚拟内存
V确实映射到内核管理的页缓存C,但V的初始权限是只读。 - 写入
V是否直接修改C完全取决于映射类型:SHARED映射:权限变更后,写入操作直接修改页缓存C,内核后续会将修改同步到磁盘文件。PRIVATE映射:第一次写入触发COW后,写入的是复制后的新物理页C',原页缓存C不会被修改,也不会同步到磁盘。
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

