1.生产者消费者问题:
(1)问题分析:系统中有一组生产者进程和消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区取出一个产品并使用。(产品:可以理解为某种数据)
生产者、消费者共享一个初始为空、大小为n的缓冲区。
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
——同步关系。缓冲区满时,生产者要等待消费者取走产品。
只有缓冲区不空时,消费者才能从缓冲区取走产品,否则必须等待。
——同步关系。缓冲区为空时,消费者要等待生产者放入产品。
缓冲区是临界资源,各进程必须互斥地访问。
——互斥。
(2)可以用信号量机制(P、V操作)实现生产者、消费者进程的这些功能。
(3)信号量机制可实现互斥、同步、对一类系统资源的申请和释放。
互斥:设置初值为1的互斥信号量。
同步:设置初值为0的同步信号量(实现"一前一后")。
对一类系统资源的申请和释放:设置一个信号量,初始值即为资源的数量。(本质上也属于"同步问题",若无空闲资源,则申请资源的进程需要等待别的进程释放资源后才能继续往下执行)
(4)P、V操作题目分析步骤:
①关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
②整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
生产者每次要消耗(P)一个空闲缓冲区,并生产(V)一个产品。
消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V)。
往缓冲区放入/取走产品需要互斥。
③设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
(5)如何实现:
mutex:互斥锁。
(6)能否改变相邻P、V操作的顺序:
若此时缓冲区内已经放满产品,则empty=0,full=n。
按照①->②->③ 的顺序执行,生产者进程执行①使得mutex变为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞。此时切换回消费者进程,执行③,由于mutex为0,即生产者还没释放对临界资源的"锁",因此消费者也被阻塞。
这就造成了生产者等待消费者释放空闲缓冲区,而消费者由等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现"死锁"。
若缓冲区没有产品,即full=0,empty=n。
按照③->④->①的顺序执行也会发生死锁。
因此,实现互斥的P操作一定要放在实现同步的P操作之后。
V操作不会导致进程阻塞,因此两个V操作顺序可以交换。
(7)小结: