生产者消费者问题

问题描述

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)。生产者、消费者共享一个初始为空、大小为n的缓冲区。
在这里插入图片描述

只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
缓冲区没满-->生产者生产
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
缓冲区没空-->消费者消费

缓冲区是临界资源,各进程必须互斥地访问。(互斥关系)

PV操作题目分析步骤:
1.关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
2.整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
3.设置信号量,并根据题目条件确定信号量初值。(互斥信号量初值为1,同步信号量的初值要看对应资源的初始值为多少)。
在这里插入图片描述

如何实现

生产者、消费者共享一个初始为空、大小为n的缓冲区
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
缓冲区是临界资源,各进程必 须互斥地访问
在这里插入图片描述

思考:能否改变相邻 P、V操作的顺序

在这里插入图片描述
实现互斥的P操作一定要放在实现同步的P操作之后,否则会出现“死锁”。

V操作不会导致进程阻塞,因此两个V操作顺序可以交换。

知识回顾与重要考点

在这里插入图片描述

多生产者-多消费者

“多”指多种类型的生产者,多种类型的消费者。

问题描述

在这里插入图片描述
在这里插入图片描述

如何实现

在这里插入图片描述
问题:可不可以不用互斥信号量?
在这里插入图片描述
结论:即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象。

原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区。

如果盘子(缓冲区)容量为2呢?
在这里插入图片描述

知识回顾与重要考点

总结:在生产者-消费者问题中,如果缓冲区大小为1,那么有可能不需要设置互斥信号量就可以实现互斥访问缓冲区的功能。当然,这不是绝对的,要具体问题具体分析。

建议:在考试中如果来不及仔细分析,可以加上互斥信号量,保证各进程一定会互斥地访问问缓冲区。但需要注意的是,实现互斥的P操作一定要在实现同步操作之后,否则可能引起“死锁”。

PV操作题目分析步骤:
1.关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
2.整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
3.设置信号量,并根据题目条件确定信号量初值。(互斥信号量初值为1,同步信号量的初值要看对应资源的初始值为多少)。
在这里插入图片描述

吸烟者问题

在这里插入图片描述

问题分析

在这里插入图片描述
在这里插入图片描述

如何实现

在这里插入图片描述

知识回顾与重要考点

在这里插入图片描述

读者-写者问题

问题描述

在这里插入图片描述

问题分析

在这里插入图片描述

如何实现

在这里插入图片描述
在这里插入图片描述

知识回顾与重要考点

在这里插入图片描述

哲学家进餐问题

问题描述

在这里插入图片描述

问题分析

在这里插入图片描述

如何实现

如何防止死锁?
在这里插入图片描述

3.仅当一个哲学家左右两只筷子都可用时才允许他抓起筷子(不太严谨)。
在这里插入图片描述

知识回顾与重要考点

在这里插入图片描述

管程

知识总览

在这里插入图片描述

为什么要引入管程

在这里插入图片描述

管程的定义和基本特征

管程是一种特殊的软件模块,有这些部分组成:
1.局部于管理的共享数据结构说明;
2.对于该数据结构进行操作的一组过程; “过程”其实就是“函数”
3.对局部于管程的共享数据设置初始值的语句;
4.管程有一个名字。

管程的基本特征:
1.局部于管程的数据只能被局部于管程的过程所访问;
2.一个进程只有通过调用管程内的过程才能进入管程访问共享数据;
3.每次仅允许一个进程在管理内执行某个内部过程

拓展1:用管程解决生产着消费者问题

在这里插入图片描述

在这里插入图片描述

拓展2:Java中类似于管理的机制

在这里插入图片描述

知识回顾与重要考点

在这里插入图片描述


Less interests,more interest.