2.3.2 PV的概念
本节导学
PV 操作是操作系统里控制并发进程访问资源的基础工具。字幕用“申请笔记本”的例子解释信号量:如果某类资源初始有 100 个,就可以用信号量 S=100 表示剩余资源数;申请一个资源时,先把 S 减 1;释放一个资源时,再把 S 加 1。
这节最重要的不是死背 P 和 V,而是理解“先改值,再判断”。P 操作是申请资源,先 S=S-1,再判断是否小于 0;V 操作是释放资源,先 S=S+1,再判断是否小于等于 0 来决定是否唤醒等待者。
信号量表示资源数量
信号量可以看成操作系统维护的一张资源清单。S>0 通常表示当前还有可用资源;S=0 表示资源刚好被用完;S<0 表示不仅没有空闲资源,还有进程正在等待,负数的绝对值常可理解为等待进程个数。
例如某资源初值为 1。第一个进程执行 P 后,S 从 1 变成 0,说明这个进程拿到了唯一资源,可以继续执行。第二个进程再执行 P,S 从 0 变成 -1,说明资源不足,第二个进程进入阻塞队列。
P 操作:申请并检查
P 操作的语义可以写成:
S = S - 1
if S < 0:
进程进入阻塞队列为什么不是 S <= 0 阻塞?因为 P 是先减 1 再判断。减完后等于 0,表示原来刚好还有 1 个资源,已经分配给当前进程,因此当前进程仍然可以继续执行。只有减完后小于 0,才说明当前申请已经超过资源总数。
V 操作:释放并唤醒
V 操作的语义可以写成:
S = S + 1
if S <= 0:
唤醒一个等待进程为什么 V 是 S <= 0 时唤醒?如果释放前 S 为负,说明有进程排队等待。释放后即使 S 变成 0,也代表刚释放的资源应当交给某个等待者,所以需要唤醒一个阻塞进程。被唤醒的进程不会立刻运行,而是进入就绪队列,等待 CPU 调度。
与进程状态的连接
P 操作资源不足时,缺的是非 CPU 资源,因此进程进入阻塞态。V 操作释放资源后,等待该资源的进程条件满足,但它还没有 CPU,所以进入就绪态。这正好对应前面状态图中的“运行 -> 阻塞”和“阻塞 -> 就绪”。
做题路线
- 看到 P,先写
S=S-1,再用S<0判断阻塞。 - 看到 V,先写
S=S+1,再用S<=0判断唤醒。 S=0对 P 来说表示刚好拿到资源,不阻塞。S<0时,负数绝对值通常表示等待队列中的进程数。- 被 V 唤醒的进程先进就绪队列,不是直接运行。
例题
自查要点
- 为什么 P 操作是
S<0才阻塞? - 为什么 V 操作是
S<=0时唤醒? - 被 V 操作唤醒的进程为什么先进就绪队列?