You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于boost::iostreams::mapped_file写入时缺页异常的技术问询

关于boost::iostreams::mapped_file写入时触发轻微缺页的解析

问题场景回顾

你通过boost::iostreams::mapped_file完成的测试流程:

  • 磁盘上有一个1页(4096字节)的文件,以readwrite模式创建映射
  • 读取第一个字节,触发预期的缺页异常
  • 重复读取,无缺页,符合预期
  • 写入1个字节,出现1次轻微缺页,存在困惑
  • 再次写入,无缺页,符合预期

核心原因解析:权限变更与写时复制(COW)

步骤4的轻微缺页并非因为页不在物理内存,而是内核需要处理虚拟页的权限变更或写时复制逻辑,属于"软缺页"(minor page fault),不需要从磁盘加载数据:

  1. 步骤2后的页状态
    当你第一次读取映射页时,内核会将磁盘文件加载到页缓存C,并将进程虚拟内存V映射到C,但此时虚拟页的权限是只读的——内核默认以只读权限映射页缓存,目的是避免无限制的直接修改影响缓存一致性。

  2. 第一次写入时的内核操作
    当你首次尝试写入V时,CPU会触发权限异常,内核需要介入处理:

    • 若为PRIVATE映射:内核会复制页缓存C到新的物理页C',将V重新映射到C',并把V的权限改为可写。这个内存内的复制操作会触发一次轻微缺页。
    • 若为SHARED映射:内核会检查页缓存C是否与磁盘内容一致(干净页),确认后直接将V的权限改为可写,允许后续写入直接修改C。这个权限变更的页表更新操作同样会触发轻微缺页。
  3. 第二次写入无缺页的原因
    第一次写入后,虚拟页的权限已经变为可写,后续写入无需再触发内核的权限或复制逻辑,因此不会产生缺页。

关于映射类型与页缓存的关系

你的假设基本正确,但需要明确映射类型的差异:

  • 步骤2后,进程虚拟内存V确实映射到内核管理的页缓存C,但V的初始权限是只读。
  • 写入V是否直接修改C完全取决于映射类型:
    • SHARED映射:权限变更后,写入操作直接修改页缓存C,内核后续会将修改同步到磁盘文件。
    • PRIVATE映射:第一次写入触发COW后,写入的是复制后的新物理页C',原页缓存C不会被修改,也不会同步到磁盘。

内容的提问来源于stack exchange,提问作者doraemon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:45:06