软件设计师 · 高频练习

fork之后父子进程为什么不用立刻复制全部内存页?

中级 单选题 第 1101 题 较难 软件设计师Copy-on-Writefork页表缺页异常
题目

操作系统创建子进程时采用Copy-on-Write。fork完成后,父子进程都只读取一块100MB的内存,随后子进程只修改其中一个4KB页面。下列描述正确的是()。

A fork时立即复制全部100MB,否则父子进程不能读取
B 父子先共享物理页并限制写入,子进程写该页时再复制该4KB页面形成私有副本
C 子进程写入会直接修改父进程看到的所有普通私有页面
D Copy-on-Write保证永远不发生页面复制
题目类型:原创高频练习题 用途:用于帮助理解软件设计师相关考点和答案解析,不等同于官方真题。
正确答案
B
答案解析

写时复制让父子页表先指向相同物理页,并把相关映射设为不可直接写。某一方写入时触发保护异常,内核复制被写页面、更新映射后再继续,因此本例主要复制一个4KB页面而非全部100MB。

选项分析

A

错误。立即全量复制正是COW要避免的成本。

B

正确。先共享,写入时按页复制并更新写入方映射。

C

错误。普通私有映射要求父子修改互不影响,写入会先分离页面。

D

错误。发生写操作时仍可能复制,只是按需进行。

本题为什么容易错

“共享物理页”常被误解成共享变量。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页面后才复制该页,未修改页面继续共享。