跳转至

PV 与记录型信号量

先预测最终计数与阻塞者,再逐步观察原子 P/V 调用。这里采用记录型定义:P 先减一,负数时阻塞;V 先加一,结果不大于零时唤醒一个等待者。

正在载入练习。

模型约定

  • 一个通用计数信号量,初值为 0–8;P/V 事件整体原子执行,不展开实现内部的锁。
  • 等待队列按 FIFO 唤醒。获唤醒者的 P 已完成,不再减一次;被阻塞的进程在唤醒前不能执行下一个事件。
  • 输入用 P0:P、P1:V 表示进程与操作,最多 40 次调用、6 个进程。通用信号量允许另一进程 V,不把它当作带所有权检查的互斥锁。
  • 这不是调度器或完整生产者—消费者模型;单个信号量的计数不能代替多资源的互斥及次序检查。

自编算例

初始 S=1,依次执行 P0:P、P1:P、P0:V、P1:V。

事件 S 的变化 等待队列与结果
P0:P 1 → 0 P0 取得许可
P1:P 0 → −1 P1 阻塞,队列为 P1
P0:V −1 → 0 唤醒 P1,队列清空;P1 的 P 返回
P1:V 0 → 1 归还一个许可

最终 S=1,无阻塞进程。每一步都满足 S=初值−P 次数+V 次数;采用本定义时,S<0 的绝对值对应等待者数量。若在第二步后直接输入 P1:V,该事件不合法,因为 P1 尚未被唤醒。

回看进程管理的信号量讲解 · 全部交互练习