Appearance
题目
下列关于父进程与子进程的叙述中,错误的是( )。
错因
A
把"父子"这层关系想得太亲——觉得父进程要等子进程一起跑、或者父进程必须 wait() 阻塞等子进程结束。其实 fork 后两个进程就是平等的、独立调度的实体,CPU 给谁用、什么时候切换由调度器说了算,并发执行是常态,不是例外。
C
误把"父子进程"当成了"线程"。线程才是同进程内共享资源、各自只有少量私有状态。进程是 OS 调度的基本单位,每个进程一个 PCB(进程控制块)记着自己的 PID、状态、上下文、地址空间、打开文件表等等——父子也不例外。"有不同的 PCB"是进程的定义本身。
D
把"临界资源"和"共享资源"混为一谈了。临界资源的定义就是一次只能被一个进程使用——那是临界资源的本质属性,跟两个进程是不是父子毫无关系。任何两个进程都不能同时用同一个临界资源(不然就破坏互斥了),父子只是其中一个特例。
总解析
题问"错误",B 一眼可疑——因为这正是把进程和线程搞混的高发点。
fork 创建子进程时,OS 会把父进程的地址空间复制一份给子(现代 OS 用写时复制 COW 优化,但语义上仍是"独立副本",写入时立即分裂为各自的物理页):
| 资源 | 父子是否共享 |
|---|---|
| 虚拟地址空间 | 不共享(各自独立副本) |
| 物理内存(COW 期间) | 暂时共享只读页,写入时分裂 |
| PCB | 不共享(每进程一份) |
| 打开的文件描述符 | 复制一份,但底层系统打开文件表项共享 |
| 全局变量 | 不共享(各自副本,互不影响) |
所以 B 错——父子虚拟地址空间是各自独立的,不共享。这一点常被误背成"共享",因为:① 跟"线程共享地址空间"混了;② COW 优化在物理层面短暂共享只读页,被误推到虚拟层面。
A、C、D 都对:
- A:父子是平等的可调度进程,并发是常态
- C:每个进程一份 PCB,父子也不例外
- D:临界资源的定义就是互斥访问,父子也不能同时用
最终答案是 B。