文章目录

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

前言

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


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

问题描述

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

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


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

PV操作题目分析步骤:

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

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

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

如何实现

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

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

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

接下来我们再来考虑第三个问题:生产者生产产品和消费者使用产品。这两个操作,它们都是放在各自的这些pv操作之外的,那这些操作能不能放到pv操作之内呢?

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

知识回顾与重要考点


PV操作题目的解题思路:

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

生产者-消费者问题(有例题!!!)相关推荐

  1. 多线程-线程通信:生产者消费者例题

    /*** 线程通信的应用:经典例题:生产者/消费者问题** 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,* 店员一次只能持有固定数量的产品( ...

  2. 【Java】线程通信的例子:用两个线程打印 1-100;生产者消费者问题

    wait()和sleep()的区别 面试题:sleep() 和 wait()的异同? 相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态. 不同点: 1)两个方法声明的位置不同:Thread类中声 ...

  3. RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现

    生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...

  4. 【C++】多线程(链式、循环队列)实现生产者消费者模式

    生产者消费者模式:         生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

  5. 面试官让我手写一个生产者消费者模式?

    不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...

  6. windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现

    生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...

  7. 基于队列的生产消费设计java_生产者-消费者设计模式

    一.生产者消费者设计模式 1.中间队列 一段内存空间,且可存取: 2.两种角色 (1)生产者:生产数据: (2)消费者:消费数据. 3.三种关系 (1)生产者与生产者的互斥关系: (2)消费者与消费者 ...

  8. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

  9. 生产者/消费者模型详解(基于Java)

    title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...

最新文章

  1. mysql-5.5.25_Linux下安装Mysql-5.5.25
  2. 10自带sftp服务器_一文讲透FTP和SFTP的区别
  3. python创建新文件-python创建和删除文件
  4. Fedora 31 正式版今天发布,Python不是传说的3.8,而是3.7.4
  5. 【HDOJ】2732 Leapin' Lizards
  6. 这场戏里,到底是谁脏了?
  7. Android Jetpack组件之数据库Room详解(二)
  8. Ehcache配置文件加载方式
  9. android Fragment 笔记
  10. Linux 之 hugepage 大页内存理论
  11. Python+OpenCV:图像去噪(Image Denoising)
  12. LINUX当前目录下的文件夹大小
  13. 超级好用的画图吸色工具FastSton Capture
  14. 将数字转换为中文大写(缩写)
  15. 2015阿里天池大数据竞赛解题源码
  16. 如何获取计算机网络地址,如何查看电脑网卡获取的IP地址是多少?
  17. 如何用数学课件制作工具画函数切线
  18. 多媒体计算机技术应用,谈谈多媒体计算机技术在教学中的应用
  19. unity游戏开发-socket网络通信
  20. 新生代垃圾回收器和老生代垃圾回收器

热门文章

  1. 基于JAVA干洗店订单管理系统设计与实现计算机毕业设计源码+数据库+lw文档+系统+部署
  2. BUUCTF--[HITCON 2016]Leaking
  3. iOS7下status bar相关问题的解决方法
  4. AAA认证是什么?一文带你科普AAA认证及协议
  5. 楼宇控制系统发展过程
  6. 美可汗学院因用户基数过小决定移除其在Windows上的软件
  7. Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例
  8. 印象笔记如何取消首字母大写
  9. gravity 安装部署
  10. 7-6 数据结构实验之链表七:单链表中重复元素的删除 (20 分)