Skip to content

2020年 408 操作系统 第 29 题

操作系统2020年选择题2分

题目

下列关于父进程与子进程的叙述中,错误的是( )。

错因

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

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数