生产者-消费者问题(有例题!!!)

文章目录

  • 前言
  • 问题描述
  • 如何实现
  • 思考:能否改变相邻P、V操作的顺序?
  • 知识回顾与重要考点

前言

此篇文章是我在B站学习时所做的笔记,大部分图片都是课件老师的PPT,方便复习用。此篇文章仅供学习参考。


提示:以下是本篇文章正文内容

问题描述

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)

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


解释:
在刚开始,由于这个缓冲区全部是空的,所以生产者进程可以生产一些产品,把它放入到这个缓冲区当中。那一直到这个缓冲区被充满了之后,如果此时生产者进程,它还想继续生产产品,并且把它充入缓冲区的话,那这个行为很显然应该是被阻止的,因为此时缓冲区的这些数据已经被装满了,那只有这个缓冲区腾出别的空闲的空间之后,生产者进程才可以继续往里边放出去,所以在这个时候,只能切换为消费者进程来消费这些数据,也就是从缓冲区当中取走其中的一些产品或者说数据,只要缓冲区当中有一个或者大于一个的空闲的空间,那么此时就可以唤醒生产者进程,让他从阻塞态又重新回到就绪队列,当然这个唤醒并不意味着生产者进程就立即回处理机运行,它只是回到了就绪队列而已,所以接下来有可能是消费者进程继续执行那么每一次每一轮执行都会从缓冲区取走一轮,并且使用,那一直到这个缓冲区被取空了之后,如果此时消费者进程还继续尝试从缓冲区当中取走产品的话,那由于此时已经为空了,那么这个时候这个取产品的行为,应该是被阻止了,所以消费者进程应该被阻塞,而只有生产的进程再往里边放数据的时候,消费者进程才可以在重新被唤醒,又重新回到了就是就绪队列,这个缓冲区它属于一种临界资源,各个进程是必须互斥的访问的,假如说我们的这个系统当中有两个生产者竞争,那此时这两个生产者进程在检查了之后,发现缓冲区的这些位置,每个地方都是空的,那这个生产者进程他可能就往这个位置,充入了一个它自己的产品,也就是数据,而另一个生产者进程在之前的那个检查当中也发现这个缓冲区所有的地方都是空的,那么在并发的环境下,就有可能导致这个生产者进程,它同时也在检查了之后,也往这个地方充入了一个数据,所以这就导致了前者的数据背后的数据给覆盖的情况,因此我们是必须保障缓冲区是被互斥地访问的。

PV操作题目分析步骤:

  1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
  2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。

生产者每次要消耗(P)一个空闲缓冲区,并生产(V)一个产品。
消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V)。
[第一个P和第二个V是一对,第二个P和第一个V是一对]
往缓冲区放入/取走产品需要互斥。

  1. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)

如何实现

生产者-消费者问题(有例题!!!)_第1张图片

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

生产者-消费者问题(有例题!!!)_第2张图片

  • 若此时缓冲区内已经放满产品,则empty=0,full=n。
  • 则生产者进程执行①使mutex变为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞。由于生产者阻塞,因此切换回消费者进程。消费者进程执行③,由于mutex为0,即生产者还没释放对临界资源的“锁”,因此消费者也被阻塞。
  • 这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。
  • 同样的,若缓冲区中没有产品,即full=0,empty=n。按③④①的顺序执行就会发生死锁。

因此,实现互斥的P操作一定要在实现同步的P操作之后。 V操作不会导致进程阻塞,因此两个V操作顺序可以交换。

接下来我们再来考虑第三个问题:生产者生产产品和消费者使用产品。这两个操作,它们都是放在各自的这些pv操作之外的,那这些操作能不能放到pv操作之内呢?
生产者-消费者问题(有例题!!!)_第3张图片
答:其实逻辑上来看是没有问题的,我们可以让消费者从缓冲区取出一个产品之后,就立即紧接着使用产品。但这会导致临界区的这个代码量变大,那么消费者进程在访问临界区的过程当中,就需要耗费更长的时间。那如果此时有别的进程也想访问临界区的话,它是会被阻塞的,所以说如果把这些非必要的代码把它也放到临界区内的话,就显然会导致进程之间的并发度降低,所以对于这两部分的大码,我们最好不要放到pv操作之间。

知识回顾与重要考点

生产者-消费者问题(有例题!!!)_第4张图片
PV操作题目的解题思路:

  1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
  2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
  3. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
  • 生产者消费者问题是一个互斥、同步的综合问题。
  • 对于初学者来说最难的是发现题目中隐含的两对同步关系。
  • 有时候是消费者需要等待生产者生产,有时候是生产者要等待消费者消费,这是两个不同的“一前一后问题”,因此也需要设置两个同步信号量。

你可能感兴趣的:(操作系统原理(理论),操作系统,linux,生产者-消费者问题,进程互斥,进程同步)