22.生产者-消费者问题
🍅问题分析
-
系统中有一组生产者进程和一组消费者进程,消费者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)
-
生产者,消费者共享一个初始为空,大小为 n 的缓冲区
-
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待
-
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待
-
缓冲区是临界资源,各进程必须互斥地访问(防止前一个数据被后一个数据覆盖)
-
考试中便是利用 信号量机制(P,V操作)实现生产者,消费者进程的这些功能
信号量机制可实现互斥,同步,对一类系统资源的申请和释放
🍅PV 操作题目的解题思路:
- 关系分析。找出题目中描述的各个进程,分析它们之间的同步,互斥关系
- 整理思路。根据各进程的操作流程确定 P,V 操作的大致顺序
- 生产者每次要消耗(P)一个空闲缓冲区,并每次生产(V)一个产品
- 消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V)
- 往缓冲区 放入/取走 产品需要互斥
- 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为 1,同步信号量的初始值要看对应资源的初始值是多少)
- **实现互斥操作的P操作一定要在实现同步的P操作之后!**否则会出现 死锁
- 而 V 操作不会导致进程堵塞,因此两个 V 操作顺序可以交换
用信号量 实现互斥 是在同一进程中进行 一对 PV 操作
实现两进程的同步关系,是在其中一个进程中执行 P,另一个进程中执行 V
🍅总结
- 生产者消费者问题是一个互斥,同步的综合问题
- 对于初学者来说,最难的是发现题目中隐含的两队同步关系
- 有时候是消费者需要等待生产者生产,有时候是生产者要等待消费者消费,这是两个不同的“一前一后问题”,因此也需要设置两个同步信号量