多生产者-多消费者问题
- 模型特点
- 与经典生产者消费者模型不同,存在多类生产者和多类消费者,各自生产/消费不同类型的产品
- 具体场景
-
- 共享资源:容量为1的盘子(缓冲区)
- 生产者1(父亲):专门放入苹果
- 生产者2(母亲):专门放入橘子
- 消费者1(女儿):专门取出苹果
- 消费者2(儿子):专门取出橘子
- 互斥关系
- 对盘子的访问需要互斥
- 同步关系
-
- 父亲放入苹果 → 女儿取出苹果
- 母亲放入橘子 → 儿子取出橘子
- 女儿/儿子取出水果 → 父亲/母亲放入水果
- 抽象理解
-
- 将同步关系理解为事件先后关系而非进程行为关系
- "盘子为空"事件由女儿或儿子触发
- "放入水果"事件由父亲或母亲执行
- mutex=1:实现互斥访问盘子
- apple=0:盘子中苹果数量
- orange=0:盘子中橘子数量
- plate=1:盘子剩余容量
- 生产者逻辑
- 准备水果 → P(plate) → P(mutex) → 放入 → V(mutex) → V(对应水果信号量)
- 消费者逻辑
- P(对应水果信号量) → P(mutex) → 取出 → V(mutex) → V(plate) → 消费
- 缓冲区大小为1时
-
- 可能不需要mutex信号量
- 因为三个同步信号量(apple/orange/plate)任一时刻最多一个为1
- 保证任何时候只有一个进程能通过P操作
- 缓冲区大小>1时
-
- 必须使用mutex保证互斥访问
- 否则可能出现多个生产者同时通过P(plate),导致并发访问和数据覆盖
- PV操作顺序:互斥P操作必须在同步P操作之后,否则可能引起死锁
- 分析角度:应从事件先后关系角度抽象分析同步关系,而非从单个进程行为角度分析
- 考试重点
-
- 缓冲区容量与互斥需求的关联性分析
- 同步信号量设计(特别是plate信号量的使用)
- 易错点
-
- 混淆"多类"生产/消费者与经典单类模型的差异
- 错误安排PV操作顺序导致死锁
- 从进程行为而非事件关系角度分析同步