一、问题描述

信号量机制实现进程互斥的步骤:

  1. 设置初值为1的互斥信号量
  2. 在访问临界区之间进行P操作
  3. 在访问完临界区之后进行V操作

信号量机制实现进程同步的步骤:

  1. 设置初值为0的同步信号量
  2. 在前操作之后对同步信号量执行V操作
  3. 在后操作之前对同步信号量执行P操作

注意:
前操作指的就是需要先进行的操作,比如:当缓冲区已满的时候,消费者先取走缓冲区的产品,生产者才能生产产品放入缓冲区。这里的“消费者先取走缓冲区的产品”就是前操作;而” 生产者生产产品放入缓冲区“就是后操作


注意:
生产者-消费者问题中共存在3个信号量:一个是空闲缓冲区对应的信号量,一个是产品对应的信号量,还有一个是用来实现互斥访问临界区的互斥信号量

  1. 生产者每次要消耗一个空闲缓冲区,而消耗一个资源(空闲缓冲区)也就是对这个资源的信号量执行P操作
    因为P操作会对这个资源的信号量的数值进行-1操作,如果该信号量-1后的数值 < 0,说明在没有进行-1操作之前,信号量的数值 是<= 0的。也就是说,在没有进行-1操作之前已经没有资源(空闲缓冲区),资源(空闲缓冲区)的数量为0,所以会使用block原语使进程从运行态进入阻塞态,并把该进程挂到该信号量的等待队列(即阻塞队列)中
    直到消费者释放一个空闲缓冲区,也就是对空闲缓冲区对应的信号量执行了V操作之后,也就是增加一个空闲缓冲区之后,生产者进程才能再次被唤醒

  2. 生产者进程在确认了空闲缓冲区的数量是足够的情况下,会生产一个产品(非空闲缓冲区),也就是对 产品所对应的信号量执行V操作
    因为V操作会对产品所对应的信号量的数值进行+1操作,相当于是往空闲缓冲区中放了一个产品,即非空闲缓冲区数量+1。如果进行+1操作之后,该信号量的数值<=0,说明在没有进行+1操作之前,该信号量的数值是<= -1的,这里的-1取绝对值之后代表的就是空闲缓冲区的数量,也就是等待队列中的进程数量为1。这时,会使用wakeup原语唤醒等待队列中的进程,让等待队列中的进程由阻塞态变为就绪态。
    而消费者在消耗一个产品之前,需要对这个产品所对应的信号量执行P操作,表示要消耗一个产品(即非空缓冲区)。

二、问题分析


三、如何实现?

第一步:
首先,明确生产者需要做2间事情:生产一个产品把产品放入缓冲区
消费者也需要做2间事情:从缓冲区取出一个产品使用一个产品

第二步:
生产者生产一个产品之后,相当于是消耗了一个空闲的缓冲区,而空闲缓冲区的数量是由empty来控制的,需要将empty的数量进行-1操作,所以要在生产者生产一个产品之后执行P(empty)操作,表示消耗了一个空闲缓冲区

第三步:
生产者把产品放入缓冲区之后,相当于是增加了一个产品(非空闲缓冲区),而非空闲缓冲区的数量是由full来控制的,需要将full的数量进行+1操作,所以要在生产者把产品放入缓冲区之后执行V(full)操作,表示增加了一个产品(非空闲缓冲区)

第四步:
消费者从缓冲区取出一个产品之前,需要执行P(full)操作,表示要消耗一个产品(非空缓冲区)

第五步:
消费者在使用产品之前,需要执行V(empty)操作,表示要增加一个空闲缓冲区

第六步:
实现多个生产者对生产者把产品放入缓冲区这个临界区的互斥访问
实现多个消费者对消费者从缓冲区取出产品这个临界区的互斥访问
生产者把产品放入缓冲区的操作应该放在临界区内,这样才能避免存在多个生产者并发的执行 将产品放入缓冲区的代码。所以要在进入临界区之前执行P(mutex)操作,离开临界区之后执行V(mutex)操作
消费者同理,需要在进入临界区之前执行P(mutex)操作,离开临界区之后执行V(mutex)操作

注意

  1. 如果要实现互斥关系的话,这对P、V操作是在同一个进程中的
  2. 如果要实现(一前一后的)同步关系的话,这对P、V操作是分别位于两个不同的进程之中的



对“前V后P”的理解:
前操作之后执行V操作,后操作之前执行P操作

在缓冲区为空的情况下:生产者生产产品需要在消费者消费产品之前。因此,在生产者生产产品之后,需要执行V(full)操作;消费者消费产品之前,需要执行P(full)操作

三、操作系统——生产者-消费者问题(两个同步一个互斥)相关推荐

  1. 操作系统 — 生产者消费者模型

    生产者消费者模型 所谓的生产者消费者模型就是一个类似于队列一样的东西串起来,这个队列可以想像成一个存放产品的"仓库",生产者只需要关心这个 "仓库",并不需要关 ...

  2. 操作系统 —— 生产者消费者模型

    文章目录 1. 生产者消费者模型的理解 1.1 串行的概念 1.2 并行的概念 1.3 简单总结: 2. 基于阻塞队列(block queue)实现此模型 2.1 阻塞队列的实现 2.2 使用阻塞队列 ...

  3. 生产者-消费者 领导者-追随者 半同步-半异步

    转载自:http://blog.csdn.net/henuyx/article/details/39458215 都是概念问题,实现并不是什么难事,网上示例一搜一大堆. 一. 生产者-消费者模型 ht ...

  4. (二十二)操作系统-生产者·消费者问题

    文章目录 一.问题描述 二.问题分析 三.PV操作题目分析步骤 1. 关系分析 2. 整理思路 3. 设置信号量 4. 编写代码 四.能否改变相邻P.V操作的顺序? 五.小结 1. PV操作题目的解题 ...

  5. 操作系统——生产者-消费者问题

    一.简单生产者-消费者问题 问题描述:一组生产者进程和一组消费者进程共享一个初始为空.大小为 n 的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待:只有缓冲区不为空时,消费者才能 ...

  6. 生产者消费者伪码_[线程同步]生产者消费者代码实现

    生产者消费者问题是一个著名的线程同步问题,该问题描述如下: 有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者 ...

  7. 操作系统——生产者消费者模型以及信号量

    生产者--消费者问题是 多个进程因共享一个缓存区而产生的相互依赖问题 .具体来说,生产者进程往往要往共享缓存区中放内容.消费者进程从共享缓存中取内容, 当缓存区满的时候 ,生产者进程需要等待消费者进程 ...

  8. [操作系统]生产者/消费者问题

    生产者/消费者问题也叫缓存绑定问题(bounded- buffer),是一个经典的.多进程同步问题. 单生产者和单消费者 仓库容量为一的情况 问题分析: 仓库有空位时,生产者才能生产产品,并放入仓库中 ...

  9. 操作系统生产者消费者问题实验报告

    操作系统实验报告 进程通信 1. 问题描述及需求分析: 问题描述 本次实验实现生产者和消费者之间的通信,即生产者-消费者问题.生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素. ...

最新文章

  1. python写http文件下载器_http分片请求-python分片下载文件
  2. 洛谷 1858 多人背包
  3. 如果华为自主的操作系统,对消费者和华为会有什么影响?
  4. 2017.0613.《计算机组成原理》总线控制-通信控制
  5. 数据库中字段类型Number(n,m)大概说明
  6. C语言main()主函数执行完毕后是否会再执行一段代码
  7. linux系统命令行方式复制文件
  8. 方程推导:二阶有源带通滤波器设计!(下载:教程+原理图+视频+代码)
  9. 如何绘制业务架构图 — 2.框架图
  10. 化学与计算机技术,计算机技术与化学教学整合浅议
  11. loj121-动态图连通性
  12. 关于OC中委托(代理人)的理解
  13. web安全:X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:‘这是夹心饼干的意思吗?’
  14. 1919:【02NOIP普及组】选数
  15. java 拼html页面返回,java返回html标签
  16. 广东计算机一级试题答案,广东计算机一级考试试题和答案
  17. 【esp8266】③esp8266对接天猫精灵实现语音控制
  18. 数学建模竞赛中的两个技巧
  19. C++技术的主要应用领域
  20. 2.Python3标准库--文本

热门文章

  1. python until怎么用_python基础之从认识python到python的使用
  2. 【机器学习】图片中的人脸识别
  3. pycharm 快捷键大全
  4. Mysql数据库使用总结
  5. centos7部署两个mysql_一文掌握mysql实用工具--pt-online-schema-change、innotop部署
  6. java中文乱码decode_Java中文乱码处理
  7. python大数据工程师 培训_大数据工程师学习之路
  8. DebugView的使用[通用汇总]
  9. Linux: shell 中命令代换 $() 和 ``(有图有代码有真相!!!)
  10. python 比赛成绩预测_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!值得,涨知识了!...