2.3.3 信号量与PV操作
本课核心知识点整理
本节导学
上一节讲 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。
- 题干强调“A 必须先于 B”,按同步处理,A 后放
V(S),B 前放P(S)。 - 临界区是访问临界资源的代码段,不是资源本身。
- 判断空格填 P 还是 V 时,申请/等待写 P,释放/通知写 V。
- 互斥是间接制约,同步是直接制约。
例题
单选
利用 PV 操作最典型的作用是:
单选
用于单个临界资源互斥的信号量初值通常为:
单选
若 B 必须等待 A 完成,常见同步写法是:
自查要点
- PV 操作为什么被称为原语?
- 互斥信号量和同步信号量的初值通常有什么区别?
- 为什么 PV 操作不等于提高资源利用率?