操作系统创建子进程时采用Copy-on-Write。fork完成后,父子进程都只读取一块100MB的内存,随后子进程只修改其中一个4KB页面。下列描述正确的是()。
写时复制让父子页表先指向相同物理页,并把相关映射设为不可直接写。某一方写入时触发保护异常,内核复制被写页面、更新映射后再继续,因此本例主要复制一个4KB页面而非全部100MB。
选项分析
错误。立即全量复制正是COW要避免的成本。
正确。先共享,写入时按页复制并更新写入方映射。
错误。普通私有映射要求父子修改互不影响,写入会先分离页面。
错误。发生写操作时仍可能复制,只是按需进行。
本题为什么容易错
“共享物理页”常被误解成共享变量。COW阶段共享的是底层存储,逻辑上仍是私有地址空间;写入异常正是维护这种隔离的机制。
简短答案
fork之后父子进程为什么不用立刻复制全部内存页,正确答案是 B(父子先共享物理页并限制写入,子进程写该页时再复制该4KB页面形成私有副本)。写时复制让父子页表先指向相同物理页,并把相关映射设为不可直接写。某一方写入时触发保护异常,内核复制被写页面、更新映射后再继续,因此本例主要复制一个4KB页面而非全部100MB。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| fork时立即复制全部100MB,否则父子进程不能读取 | 本题干扰项 | 错误。立即全量复制正是COW要避免的成本。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 父子先共享物理页并限制写入,子进程写该页时再复制该4KB页面形成私有副本 | 本题正确答案 | 正确。先共享,写入时按页复制并更新写入方映射。 | 看到题干核心场景时优先联想到它 |
| 子进程写入会直接修改父进程看到的所有普通私有页面 | 本题干扰项 | 错误。普通私有映射要求父子修改互不影响,写入会先分离页面。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| Copy-on-Write保证永远不发生页面复制 | 本题干扰项 | 错误。发生写操作时仍可能复制,只是按需进行。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- fork时立即复制全部100MB,否则父子进程不能读取:错误。立即全量复制正是COW要避免的成本。
- 子进程写入会直接修改父进程看到的所有普通私有页面:错误。普通私有映射要求父子修改互不影响,写入会先分离页面。
- Copy-on-Write保证永远不发生页面复制:错误。发生写操作时仍可能复制,只是按需进行。
知识点详解
fork后父子拥有独立虚拟地址空间,但页表可暂时映射同一物理页。内核通过页表权限和引用计数保护共享页;写入触发异常后分配新页、复制内容并让写入方指向新页。未修改页面继续共享。
备考速记
fork先共享,谁先写谁复制;复制的是被写页面,不是整个进程内存。
Copy-on-Write 在缺页异常场景中的作用
fork后立即exec的进程几乎不需要复制原地址空间,COW可显著降低创建成本。若父子都大量写入,节省会逐渐减少。
同类题怎么考
- 判断fork后物理内存是否立即翻倍。
- 解释写入某页时COW的页表和物理页变化。
Copy-on-Write 在软件设计师软考中的考法
题目给出大内存但只修改少量页面时,答案应体现按页、按需复制,而不是全量复制或永久共享。
解题思路
题干故意给100MB和4KB两个量。若一fork就复制100MB,COW没有意义;它真正节省的是未被修改的绝大多数页面。子进程只改一页,就只为这页付复制成本,选B。
考点定位
COW推迟的是复制时机,不是取消隔离。只读共享节省内存,真正写入的页面才产生私有副本。
易错提醒
- 把COW异常当成普通非法访问并直接终止进程。
- 统计内存时只看虚拟地址总量,误以为物理页已全部复制。
- 忽略多线程或共享内存映射与普通fork私有页语义不同。
备考提示
- 画父页表、子页表共同指向物理页,再画写入后的分叉。
- 区分COW保护异常与页面不在内存导致的调页异常。
你可能还想了解
- fork后内存会立刻翻倍吗?
- 写时复制什么时候真正复制?
- COW和共享内存有什么区别?
本文小结
fork采用COW时父子先共享物理页,子进程写入某个4KB页面后才复制该页,未修改页面继续共享。