生产者-消费者问题学习卡片

生产者-消费者问题基本模型
基本模型
🔹 系统中存在一组生产者进程和一组消费者进程
🔹 共享一个初始为空、大小为n的缓冲区
🔹 生产者每次生产一个产品放入缓冲区
🔹 消费者每次从缓冲区取出一个产品使用
💡 记忆提示
"产品"可理解为某种数据,缓冲区为存放数据的区域
同步与互斥关系
同步与互斥关系
🔸 同步关系:
  • 生产约束:只有缓冲区未满(empty>0)时生产者才能放入产品
  • 消费约束:只有缓冲区非空(full>0)时消费者才能取出产品
🔸 互斥关系:
  • 缓冲区是临界资源,各进程必须互斥访问
⚠️ 重要考点
同步信号量初始值:full=0(初始无产品),empty=n(初始空闲缓冲区)
信号量设置
信号量设置
📊 mutex=1:互斥信号量(保证缓冲区访问互斥)
📊 empty=n:同步信号量(表示空闲缓冲区数量)
📊 full=0:同步信号量(表示产品数量/非空缓冲区数)
🔑 初始值依据
empty初值为n(初始有n个空闲缓冲区)
full初值为0(初始无产品)
生产者逻辑
生产者逻辑
🔄 P(empty):申请空闲缓冲区
🔄 P(mutex):申请缓冲区访问权
🔄 放入产品
🔄 V(mutex):释放缓冲区
🔄 V(full):增加产品计数
💡 关键区别
互斥PV在同一进程内完成(上锁→访问→解锁)
消费者逻辑
消费者逻辑
🔄 P(full):申请产品
🔄 P(mutex):申请缓冲区访问权
🔄 取出产品
🔄 V(mutex):释放缓冲区
🔄 V(empty):增加空闲缓冲区
💡 关键区别
同步PV在不同进程间配合(生产者V→消费者P)
PV操作顺序
PV操作顺序
⚠️ 危险情况:若先P(mutex)后P(empty)
  • 当缓冲区满时,生产者阻塞在P(empty)
  • 消费者因无法获取mutex也被阻塞
  • 导致死锁(相互等待)
安全原则
  • 同步操作必须先于互斥P操作
  • V操作顺序可交换(不会引发阻塞)
🔑 关键结论
互斥P操作必须位于同步P操作之后
解题三步法
解题三步法
1️⃣ 分析同步/互斥关系
2️⃣ 确定PV操作顺序
3️⃣ 设置信号量及初值
🧠 核心难点
识别两对同步关系(生产依赖消费释放空间,消费依赖生产提供产品)
理解"前V后P"的实现原理
易错警示
易错警示
互斥P必须在同步P之后,否则可能死锁
临界区代码应尽量简短(不包含生产/消费耗时操作)
缓冲区满时生产者阻塞,缓冲区空时消费者阻塞
💡 优化建议
临界区优化:生产/消费动作不宜放入PV操作间,否则延长临界区时间