经典进程同步模型 — 掌握信号量的 P/V 操作及多缓冲区协作。
有生产者进程 P 和消费者进程 C,共享一个容量为 5 的环形缓冲区。
信号量:empty = 5(空位数),full = 0(产品数),mutex = 1(互斥访问缓冲区)
需要 mutex:多个 P 或 C 同时操作缓冲区时,必须互斥。
// 生产者 P
while (true) {
item = 生产产品();
P(empty); // 等空位
P(mutex); // 互斥进入
放入缓冲区(item);
V(mutex);
V(full); // 产品+1
}
// 消费者 C
while (true) {
P(full); // 等产品
P(mutex); // 互斥进入
item = 取产品();
V(mutex);
V(empty); // 空位+1
消费(item);
}
某日志系统有 3 个进程和 2 个缓冲区,缓冲区容量均为 1:
| 信号量 | 初值 | 含义 |
|---|---|---|
| empty1 | 1 | B1 空闲 |
| full1 | 0 | B1 有数据 |
| empty2 | 1 | B2 空闲 |
| full2 | 0 | B2 有数据 |
同步关系:P1→P2(前驱,通过 B1),P2→P3(前驱,通过 B2)
// P1 采集进程
while (true) {
采集数据();
P(empty1); // 等 B1 空
写 B1();
V(full1); // 通知 B1 有数据
}
// P2 分析进程
while (true) {
P(full1); // 等 B1 有数据
读 B1();
V(empty1); // 通知 B1 空
分析处理();
P(empty2); // 等 B2 空
写 B2();
V(full2); // 通知 B2 有数据
}
// P3 上报进程
while (true) {
P(full2); // 等 B2 有数据
读 B2();
V(empty2); // 通知 B2 空
发送云端();
}
| 术语 | 含义 |
|---|---|
| Max | 进程对各资源的最大需求 |
| Allocation | 已分配的资源数 |
| Need | 还需要的资源数 = Max - Allocation |
| Available | 系统当前可用资源 = 总量 - ΣAllocation |
| 安全序列 | 一个进程序列,按此顺序分配可使所有进程完成 |
系统有 5 个进程 {P0-P4},3 类资源 {A, B, C},总资源量 (12, 9, 11)。
| 进程 | Max (A, B, C) | Allocation (A, B, C) |
|---|---|---|
| P0 | 6, 4, 5 | 2, 2, 3 |
| P1 | 5, 3, 5 | 1, 1, 2 |
| P2 | 2, 5, 3 | 0, 2, 1 |
| P3 | 7, 3, 4 | 3, 1, 1 |
| P4 | 4, 4, 3 | 1, 1, 0 |
| 进程 | Need |
|---|---|
| P0 | 4, 2, 2 |
| P1 | 4, 2, 3 |
| P2 | 2, 3, 2 |
| P3 | 4, 2, 3 |
| P4 | 3, 3, 3 |
ΣAllocation:A=2+1+0+3+1=7, B=2+1+2+1+1=7, C=3+2+1+1+0=7
Available = (12-7, 9-7, 11-7) = (5, 2, 4)
一个安全序列:P3 → P1 → P0 → P2 → P4
验证(简要):P3 Need(4,2,3) ≤ Available(5,2,4) → 执行 → 释放后 Available=(8,3,5) → P1 执行 → ...
① Request(2,2,1) ≤ Need(4,2,3) ✓
② Request(2,2,1) ≤ Available(5,2,4) ✓
③ 试探分配后,Available=(3,0,3),仍可找到安全序列 → 可以分配
系统有 5 个进程 {P0-P4},3 类资源 {A, B, C},总资源量 (8, 6, 10)。
| 进程 | Max (A, B, C) | Allocation (A, B, C) |
|---|---|---|
| P0 | 6, 3, 4 | 2, 1, 2 |
| P1 | 4, 4, 3 | 1, 1, 1 |
| P2 | 3, 5, 4 | 0, 2, 1 |
| P3 | 5, 2, 4 | 2, 0, 1 |
| P4 | 4, 4, 3 | 1, 2, 0 |
| 进程 | Need |
|---|---|
| P0 | 4, 2, 2 |
| P1 | 3, 3, 2 |
| P2 | 3, 3, 3 |
| P3 | 3, 2, 3 |
| P4 | 3, 2, 3 |
ΣAllocation:A=2+1+0+2+1=6, B=1+1+2+0+2=6, C=2+1+1+1+0=5
Available = (8-6, 6-6, 10-5) = (2, 0, 5)
一个安全序列:P3 → P1 → P4 → P0 → P2
① Request(3,1,0) ≤ Need(3,3,3) ✓
② Request(3,1,0) ≤ Available(2,0,5) → 不成立!A 资源 3 > 2
③ 不能分配。当前 A 类资源不足。
餐厅预约系统:顾客订座前,系统检查剩余桌位(Available)是否满足需求(Need),确认不超卖后才确认预订,避免"超订"死锁。
练习题目 · 仅供学习参考