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

2.3.3 信号量与PV操作

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

本节导学

上一节讲 P/V 的动作规则,这一节把它放到并发控制场景里:PV 操作既能实现互斥,也能实现同步。互斥解决“同一时刻只能一个进程访问某个临界资源”;同步解决“某些操作必须按先后顺序发生”。

PV 操作被称为原语,意思是它由操作系统提供,执行过程不可分割。这个不可分割性非常关键:如果 P 操作的“减 1”和“判断”可以被打断,多个进程就可能同时以为自己拿到了同一个资源,互斥就失效了。

互斥:保护临界资源

临界资源是多个进程都可能访问,但同一时刻只允许一个进程访问的资源。字幕用“独木桥”类比:全局上大家都要过桥,说明它是共享资源;但某一时刻只能一个人通过,说明必须互斥访问。

访问临界资源的那段代码称为临界区。注意,临界区不是物理区域,而是一段访问临界资源的程序代码。

单个临界资源的典型写法是:

text
P(mutex)
访问临界资源
V(mutex)

mutex 初值通常为 1。第一个进程 P 后变为 0,可以进入临界区;第二个进程再 P 后变为 -1,进入阻塞队列,直到前一个进程 V 释放资源。

同步:控制执行先后

同步处理的是直接制约关系:某个进程的某一步必须等待另一个进程完成。例如 B 必须在 A 完成之后执行,那么常见写法是:

text
A:
  执行前驱操作
  V(S)

B:
  P(S)
  执行后继操作

同步信号量初值通常为 0。B 如果先执行 P(S),会把 S 从 0 减到 -1 并阻塞;等 A 完成后执行 V(S),唤醒 B,B 才能继续。

互斥与同步的区别

维度互斥同步
解决的问题多个进程抢同一个临界资源多个进程之间有先后依赖
制约关系间接制约,由共享资源引起直接制约,由执行顺序引起
常见初值单个临界资源通常为 1未发生的前驱事件通常为 0
典型结构P 进入临界区,V 离开临界区前驱后 V,后继前 P

PV 操作并不是为了提高资源利用率。它的作用是让访问更有秩序、更安全,避免多个进程同时进入临界区造成数据破坏;加锁本身甚至可能增加等待和切换开销。

做题路线

  1. 题干强调“同一时刻只能一个进程访问”,按互斥处理,临界资源信号量通常初值为 1。
  2. 题干强调“A 必须先于 B”,按同步处理,A 后放 V(S),B 前放 P(S)
  3. 临界区是访问临界资源的代码段,不是资源本身。
  4. 判断空格填 P 还是 V 时,申请/等待写 P,释放/通知写 V。
  5. 互斥是间接制约,同步是直接制约。

例题

单选
利用 PV 操作最典型的作用是:
单选
用于单个临界资源互斥的信号量初值通常为:
单选
若 B 必须等待 A 完成,常见同步写法是:

自查要点

  1. PV 操作为什么被称为原语?
  2. 互斥信号量和同步信号量的初值通常有什么区别?
  3. 为什么 PV 操作不等于提高资源利用率?