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

2.3.2 PV的概念

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

本节导学

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 操作的语义可以写成:

text
S = S - 1
if S < 0:
    进程进入阻塞队列

为什么不是 S <= 0 阻塞?因为 P 是先减 1 再判断。减完后等于 0,表示原来刚好还有 1 个资源,已经分配给当前进程,因此当前进程仍然可以继续执行。只有减完后小于 0,才说明当前申请已经超过资源总数。

V 操作:释放并唤醒

V 操作的语义可以写成:

text
S = S + 1
if S <= 0:
    唤醒一个等待进程

为什么 V 是 S <= 0 时唤醒?如果释放前 S 为负,说明有进程排队等待。释放后即使 S 变成 0,也代表刚释放的资源应当交给某个等待者,所以需要唤醒一个阻塞进程。被唤醒的进程不会立刻运行,而是进入就绪队列,等待 CPU 调度。

与进程状态的连接

P 操作资源不足时,缺的是非 CPU 资源,因此进程进入阻塞态。V 操作释放资源后,等待该资源的进程条件满足,但它还没有 CPU,所以进入就绪态。这正好对应前面状态图中的“运行 -> 阻塞”和“阻塞 -> 就绪”。

做题路线

  1. 看到 P,先写 S=S-1,再用 S<0 判断阻塞。
  2. 看到 V,先写 S=S+1,再用 S<=0 判断唤醒。
  3. S=0 对 P 来说表示刚好拿到资源,不阻塞。
  4. S<0 时,负数绝对值通常表示等待队列中的进程数。
  5. 被 V 唤醒的进程先进就绪队列,不是直接运行。

例题

单选
P 操作的基本语义是:
单选
P 操作后信号量 S 等于 0,通常表示当前进程:
单选
V 操作释放资源后,用来判断是否需要唤醒等待进程的条件通常是:

自查要点

  1. 为什么 P 操作是 S<0 才阻塞?
  2. 为什么 V 操作是 S<=0 时唤醒?
  3. 被 V 操作唤醒的进程为什么先进就绪队列?