信号量机制学习卡片

🔒

信号量机制概述

点击查看详情

信号量机制概述

背景与问题
  • 软件实现方法存在严重问题: 单标志法双标志先检查双标志后检查
  • 硬件实现方法无法实现"让权等待"原则
信号量定义
  • 一种变量,可以是整数或更复杂的记录型数据结构
  • 用于表示系统中某种资源的数量(如打印机资源)
  • 可解决进程互斥进程同步问题
原语特性
  • 不可中断的特殊程序段
  • 保证检查和上锁操作的原子性
  • 通过waitsignal一对原语操作信号量(PV操作)
记住: 信号量解决互斥和同步问题,通过PV操作实现
🔢

整型信号量

点击查看详情

整型信号量

定义
  • 整数型变量表示系统资源数量
  • 仅允许初始化P操作(wait)V操作(signal)三种操作
  • 不能进行常规数学运算
应用案例(打印机)
  • 初始化: int S=1
  • 执行流程:
    • P0执行wait(S): S=1→0(通过)
    • P1执行wait(S): S=0→循环等待
    • P0执行signal(S): S=0→1→P1可继续
存在问题
  • 忙等待: 不满足"让权等待"原则
  • 理论矛盾: wait原语不可中断与循环等待导致的进程切换矛盾
记住: 整型信号量有忙等问题,不满足让权等待
📊

记录型信号量

点击查看详情

记录型信号量

定义
  • 数据结构包含:
    • value: 资源剩余数量
    • *L: 等待该资源的进程队列指针
  • 改进动机: 解决"忙等"问题,实现"让权等待"
操作原语实现
  • wait(S)/P(S)操作:
    • S.value--
    • 若S.value < 0: 调用block(S.L)阻塞当前进程
    • value负数的绝对值表示等待进程数量
  • signal(S)/V(S)操作:
    • S.value++
    • 若S.value ≤ 0: 调用wakeup(S.L)唤醒队首进程
记住: 记录型信号量通过阻塞/唤醒机制解决忙等问题
🖨️

记录型信号量应用案例

点击查看详情

记录型信号量应用案例

打印机资源管理
  • 初始值: S.value=2,S.L=空队列
  • 执行序列:
    • P0申请: value=2→1
    • P1申请: value=1→0
    • P2申请: value=0→-1(阻塞)
    • P3申请: value=-1→-2(阻塞)
    • P0释放: value=-2→-1(唤醒P2)
    • P2释放: value=-1→0(唤醒P3)
    • P1释放: value=0→1
    • P3释放: value=1→2
记住: value负数表示等待进程数,释放时会唤醒
📝

重要考点与对比

点击查看详情

重要考点与对比

整型信号量缺陷
  • 仅用整型变量表示资源数
  • 违反"让权等待"原则,存在忙等现象
记录型信号量要点
  • P操作必须先S.value--,再判断是否阻塞
  • V操作必须先S.value++,再判断是否唤醒
  • 考试中默认P(S)/V(S)指记录型信号量
PV操作对比
  • 整型信号量: 仅检查资源数并加减
  • 记录型信号量: 附加进程阻塞/唤醒机制
高频考点
  • 能自行推导block/wakeup触发条件
  • 理解value正负值的实际含义
  • 编程实现wait/signal原语
记住: 考试默认记录型信号量,注意value正负含义