生产者-消费者问题学习卡片
生产者-消费者问题基本模型
基本模型
🔹
系统中存在一组
生产者进程
和一组
消费者进程
🔹
共享一个初始为空、大小为
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操作间,否则延长临界区时间