读者-写者问题学习卡片
读者-写者问题定义
- 读者进程:只读取共享文件内容,不会修改
- 写者进程:会修改共享文件内容
- 两类进程并发访问同一个共享文件
- 不同于生产者-消费者模型:读者不会"取走"数据
共享访问规则
- 允许多个读者同时读文件
- 同一时刻只允许一个写者写文件
- 写者操作时禁止其他所有进程访问
- 写者开始写前需确保无其他进程正在访问
关键实现机制
- rw信号量:初值1,控制文件访问互斥
- count计数器:记录当前读进程数量
- 第一个读进程:对rw执行P操作(加锁)
- 最后一个读进程:对rw执行V操作(解锁)
- 中间读进程:跳过锁操作直接访问
- mutex信号量:保护count变量
- w信号量:防止写者饥饿
进程关系分析
- 读者-读者:无互斥要求
- 写者-写者:需要互斥
- 写者-读者:需要互斥
- 数据一致性风险:
- 读写并发:可能读到部分更新数据
- 写写并发:数据覆盖问题
典型问题与解决方案
- 读者阻塞问题:
- 多个读进程同时检查count==0
- 可能导致多个P(rw)执行
- 解决方案:增加mutex信号量保护count变量
- 写进程锁死问题:
- 持续有读进程到达
- 写进程可能长期无法获得访问权
- 解决方案:引入w信号量实现写优先
考试重点/易混淆点
- 允许多读者同时访问 vs 写者必须独占访问
- 写者优先级处理与读者优先实现差异
- count检查与修改的原子性问题
- 信号量操作顺序引发的死锁风险
- 读者优先法 vs 读写公平法 vs 写者优先法
核心设计思想
- count计数器实现复杂互斥规则
- PV操作保证原子性
- 信号量排队解决饥饿问题
- 多信号量组合解决复杂互斥问题
- 适用于需要区分不同进程类型互斥关系的场景