Appearance
题目
设与某资源关联的信号量初值为 3,当前值为 1。若 M 表示该资源的可用个数,N 表示等待该资源的进程数,则 M、N 分别是( )。
错因
A
把可用数当成 0——但信号量当前值 = 1(正数),意味着还有 1 个资源没被分配,可用 = 1 不是 0。把"被使用了 2 个"误推到"用完了"是没看清当前值还是正数。
C
把信号量值差 (3-1=2) 错算成等待进程数——但只有信号量为负时绝对值才等于等待进程数。当前值 = 1 > 0,说明没人等待。把"差值"自动当成等待数是公式记错了。
D
把可用数算成 2——可能用了 (3 - 1) = 2 但弄反了。当前值 = 1 直接就是可用数(信号量 ≥ 0 时),不是 3 - 当前值。
总解析
信号量值的语义:
| 信号量当前值 S | 含义 | M(可用资源数) | N(等待进程数) |
|---|---|---|---|
| S > 0 | 还有 S 个资源可用 | S | 0 |
| S = 0 | 资源刚好用完,下一次 P 操作就会阻塞 | 0 | 0 |
| S < 0 | |S| 个进程正在阻塞等待 | 0 | |S| |
应用到本题:
- 初值 = 3:系统总共有 3 个该资源
- 当前值 = 1:S > 0 → 可用 1 个,无等待
| 量 | 值 | 含义 |
|---|---|---|
| M(可用) | 1 | 信号量 = 1 直接表示还剩 1 个资源 |
| N(等待) | 0 | 信号量 > 0 → 没人在等 |
反算"已分配多少个":初值 - 当前值 = 3 - 1 = 2 个已分配(被某些进程拿走在用),还有 1 个空闲,没人在等。
速记三种状态:
S > 0: 还有空座位 (S 个),没人排队
S = 0: 座位刚好坐满,没人排队
S < 0: 满了 + 还有 |S| 人在排队最终答案是 B。