Skip to content
难度基础(★)
建议时长45分钟

2.3.4 前趋图与PV操作

本课核心知识点整理
本课核心知识点手绘流程图(SVG)

本节导学

前趋图与 PV 操作是软考里非常典型的“看图填 P/V”题。字幕强调,这类题只要掌握技巧,通常属于稳定拿分点。前趋图的节点表示活动或进程,有向边表示明确的逻辑先后关系:箭头流出的节点是前驱,箭头流入的节点是后继,只有前驱完成,后继才能开始。

它考的不是互斥,而是同步。互斥关心“同一时刻谁能用临界资源”;前趋图关心“谁必须等谁完成”。

前趋图的含义

若存在:

text
A -> B

含义是 B 必须等待 A 完成。用 PV 表达时,A 完成后需要通知 B,B 开始前需要等待这个通知:

text
A:
  执行 A
  V(Sab)

B:
  P(Sab)
  执行 B

同步信号量 Sab 初值通常为 0,因为在 A 没完成之前,B 不应该开始。

一条边对应一个同步条件

做题时最稳的方式是“一条前趋边配一个信号量”。边多,信号量也会多;不要试图把所有边混成一个信号量,否则很容易把不同先后关系合并错。

图结构PV 写法
一个前驱指向一个后继前驱结束 V,后继开始 P
多个前驱指向同一后继后继开始前对每条入边都 P
一个前驱指向多个后继前驱结束后对每条出边都 V

如果节点 D 有 A、B、C 三个前驱,D 不能只等其中一个完成。它开始前必须分别检查三个同步条件:

text
P(Sad)
P(Sbd)
P(Scd)
执行 D

如果节点 A 有多个后继,A 完成后要分别通知每个后继:

text
执行 A
V(Sab)
V(Sac)
V(Sad)

为什么初值通常为 0

同步信号量表示“某个前驱事件是否已经发生”。在程序刚开始时,前驱通常还没完成,所以信号量初值为 0。后继如果抢先执行 P,会被阻塞;等前驱完成执行 V 后,后继才被唤醒进入就绪队列。

做题路线

  1. 给每条箭头命名一个信号量,例如 A -> D 命名为 Sad
  2. 对每个节点,先处理所有入边:开始前写对应的 P
  3. 执行该节点任务。
  4. 再处理所有出边:结束后写对应的 V
  5. 没有箭头直接相连的节点之间没有先后约束,可并发或任意顺序执行。

例题

单选
若前趋图中存在 A -> B,常见 PV 写法是:
单选
前趋边对应的同步信号量初值通常为:
单选
如果一个任务有多个前驱,正确处理方式是:

自查要点

  1. 前趋图中的箭头表示资源流向还是执行先后?
  2. 为什么同步信号量初值通常为 0?
  3. 多入边和多出边分别怎么写 P/V?