读者-写者问题学习卡片

📚

读者-写者问题定义

读者-写者问题定义

  • 读者进程:只读取共享文件内容,不会修改
  • 写者进程:会修改共享文件内容
  • 两类进程并发访问同一个共享文件
  • 不同于生产者-消费者模型:读者不会"取走"数据
📝

共享访问规则

共享访问规则

  • 允许多个读者同时读文件
  • 同一时刻只允许一个写者写文件
  • 写者操作时禁止其他所有进程访问
  • 写者开始写前需确保无其他进程正在访问
⚙️

关键实现机制

关键实现机制

  • rw信号量:初值1,控制文件访问互斥
  • count计数器:记录当前读进程数量
    • 第一个读进程:对rw执行P操作(加锁)
    • 最后一个读进程:对rw执行V操作(解锁)
    • 中间读进程:跳过锁操作直接访问
  • mutex信号量:保护count变量
  • w信号量:防止写者饥饿
🔄

进程关系分析

进程关系分析

  • 读者-读者:无互斥要求
  • 写者-写者:需要互斥
  • 写者-读者:需要互斥
  • 数据一致性风险:
    • 读写并发:可能读到部分更新数据
    • 写写并发:数据覆盖问题
⚠️

典型问题与解决方案

典型问题与解决方案

  • 读者阻塞问题
    • 多个读进程同时检查count==0
    • 可能导致多个P(rw)执行
    • 解决方案:增加mutex信号量保护count变量
  • 写进程锁死问题
    • 持续有读进程到达
    • 写进程可能长期无法获得访问权
    • 解决方案:引入w信号量实现写优先
📌

考试重点/易混淆点

考试重点/易混淆点

  • 允许多读者同时访问 vs 写者必须独占访问
  • 写者优先级处理与读者优先实现差异
  • count检查与修改的原子性问题
  • 信号量操作顺序引发的死锁风险
  • 读者优先法 vs 读写公平法 vs 写者优先法
💡

核心设计思想

核心设计思想

  • count计数器实现复杂互斥规则
  • PV操作保证原子性
  • 信号量排队解决饥饿问题
  • 多信号量组合解决复杂互斥问题
  • 适用于需要区分不同进程类型互斥关系的场景