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

一、问题描述

在这里插入图片描述

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

  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)操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2148. 元素计数

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;统计并返回在 nums 中同时具有一个严格较小元素和一个严格较大元素的元素数目。 示例 1&#xff1a; 输入&#xff1a;nums [11,7,2,15] 输出&#xff1a;2 解释&#xff1a;元素 7 &#xff1a;严格较小元…

四、操作系统——读者写者问题(详解)

一、问题描述&#xff1a; 二、需要满足的条件&#xff1a; 写进程与写进程之间必须互斥的写入数据&#xff08;因为如果两个写进程同时对共享数据中的区域A中的数据进行写操作的话&#xff0c;会导致数据错误覆盖的问题&#xff09;写进程与读进程之间必须互斥的访问共享数据…

二级vb笔试题库__全国计算机等级考试,2012年9月全国计算机二级VB笔试标准预测试卷试题六...

二级VisualBasic语言程序设计标准预测试卷六一、选择题(每小题2分。共70分)下列各题A)、B)、 C)、 D)四个选项中&#xff0c;只有一个选项是正确的&#xff0c;请将正确选项涂写在答题卡相应位置 上&#xff0c;答在试卷上不得分。(1)下列叙述中正确的是A)所有形态的二叉树都只…

LeetCode 2149. 按符号重排数组(双指针)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums &#xff0c;数组长度为 偶数 &#xff0c;由数目相等的正整数和负整数组成。 你需要 重排 nums 中的元素&#xff0c;使修改后的数组满足下述条件&#xff1a; 任意 连续 的两个整数 符号相反对于符号…

五、操作系统——内存相关基础知识 和 进程运行的基本原理(详解)

一、概述 二、什么是内存&#xff1f;有何作用&#xff1f; 内存是用于存放数据的硬件。程序在执行之前&#xff0c;需要先放到内存中才能被CPU处理。 平时&#xff0c;我们各种各样的软件都是存储在外存&#xff08;辅存&#xff09;里。电脑的话&#xff0c;一般是存储在硬盘…

LeetCode 2150. 找出数组中的所有孤独数字(哈希)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 。如果数字 x 在数组中仅出现 一次 &#xff0c;且没有 相邻 数字&#xff08;即&#xff0c;x 1 和 x - 1&#xff09;出现在数组中&#xff0c;则认为数字 x 是 孤独数字 。 返回 nums 中的 所有 孤独数字。你可以按…

六、操作系统——内存管理的概念(空间的分配与回收、空间的扩充、地址转换、存储保护)

一、概述 二、操作系统作为系统资源的管理者&#xff0c;当然也需要对内存进行管理&#xff0c;要管些什么呢&#xff1f; 1. 内存空间的分配与回收 连续分配&#xff1a;指为用户进程分配的必须是一个连续的内存空间。 1. 单一连续分配 在单一连续分配方式中&#xff0c;内…

计算机软件无形资产机械工具,考前秘籍,无形资产的定义及确认

原标题&#xff1a;考前秘籍&#xff0c;无形资产的定义及确认考查导向&#xff1a;每年考3分左右&#xff1b;比较简单&#xff0c;重要程度一般&#xff1b;建议与“固定资产”一章一起类比学习&#xff0c;效果更佳&#xff0c;效率更高。近三年主要考点&#xff1a;(1)无形…

一些iOS笔试题目

1.什么是arc&#xff1f;&#xff08;arc是为了解决什么问题诞生的&#xff1f;&#xff09; 首先解释ARC: automatic reference counting自动引用计数。 ARC几个要点&#xff1a; 在对象被创建时 retain count 1&#xff0c;在对象被release时 retain count -1.当retain count…

LeetCode 2151. 基于陈述统计最多好人数(状态压缩)

文章目录1. 题目2. 解题1. 题目 游戏中存在两种角色&#xff1a; 好人&#xff1a;该角色只说真话。坏人&#xff1a;该角色可能说真话&#xff0c;也可能说假话。 给你一个下标从 0 开始的二维整数数组 statements &#xff0c;大小为 n x n &#xff0c;表示 n 个玩家对彼…

七、操作系统——动态分区分配算法(详解)

一、引入 动态分区分配算法&#xff1a;在动态分区分配方式中&#xff0c;当很多个空闲分区都能满足需求时&#xff0c;应该选择哪个分区进行分配&#xff1f; 二、首次适应算法&#xff08;First Fit&#xff09; 算法思想&#xff1a;每次都从低地址开始查找&#xff0c;…

2015前端生态发展回顾(转)

引用苏宁前端架构师的一个总结作为开篇 编程技术及生态发展的三个阶段 最初的时候人们忙着补全各种API&#xff0c;代表着他们拥有的东西还很匮乏&#xff0c;需要在语言跟基础设施上继续完善然后就开始各种模式&#xff0c;标志他们做的东西逐渐变大变复杂&#xff0c;需要更好…

LeetCode 2154. 将找到的值乘以 2

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;另给你一个整数 original &#xff0c;这是需要在 nums 中搜索的第一个数字。 接下来&#xff0c;你需要按下述步骤操作&#xff1a; 如果在 nums 中找到 original &#xff0c;将 original 乘以 2 &#…

网际控制报文协议ICMP(Internet Control Message Protocol)(详解)

一、回顾下TCP/IP协议栈 二、ICMP(Internet Control Message Protocol)协议概述 三、ICMP协议的组成 四、ICMP差错报告报文&#xff08;5种&#xff09;&#xff1a; 终点不可达&#xff1a;当路由器或主机不能交付数据报时就向源点发送终点不可达报文。&#xff08;无法交付&…

王道考研学习笔记IP数据报格式IP数据报分片(超详细)

一、回顾TCP/IP协议栈 二、IP数据报格式 记忆方法&#xff1a; TCP是面向连接的服务&#xff0c;面向连接就非常6。而UDP是不面向连接的&#xff0c;数据就非常容易被“遗弃”&#xff08;17&#xff09;。因为如果不建立连接&#xff0c;这个链路是不太可靠的&#xff0c;所以…

LeetCode 2155. 分组得分最高的所有下标(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的二进制数组 nums &#xff0c;数组长度为 n 。 nums 可以按下标 i&#xff08; 0 < i < n &#xff09;拆分成两个数组&#xff08;可能为空&#xff09;&#xff1a;numsleft 和 numsright 。 numsleft 包含 nu…

强基计划对计算机,你对报考强基计划怎么看?

原标题&#xff1a;你对报考强基计划怎么看&#xff1f;提起“强基计划”&#xff0c;可能是近期高三家长们、考生们提到最多的话题了&#xff0c;尤其是高校的强基计划招生章程发布之后&#xff0c;关于“强基计划”的咨询量明显上升了许多&#xff0c;那么对于今年第一年实施…

路由算法及路由协议(详解)

一、路由算法 最佳路由&#xff1a;“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。 二、路由算法的分类 三、分层次的路由选择协议 为什么要采用分层次的路由选择协议呢&#xff1f; 因特网规模很大许多单位不想让外界知道自己的路由选择协议&#xff0c;…

LeetCode 2156. 查找给定哈希值的子串(字符串哈希)

文章目录1. 题目2. 解题1. 题目 给定整数 p 和 m &#xff0c;一个长度为 k 且下标从 0 开始的字符串 s 的哈希值按照如下函数计算&#xff1a; hash(s,p,m)(val(s[0])∗p0val(s[1])∗p1...val(s[k−1])∗pk−1)modmhash(s,p,m) (val(s[0])*p^0 val(s[1])*p^1...val(s[k-1])…

二维码扫描利用ZBar实现

上次是根据系统的属性自己封装的一个二维码扫描&#xff0c;这次给大家介绍一下基于ZBar集成的类似于QQ二维码扫描界面的二维码扫描的效果。 最下方配有效果图哦&#xff01; 首先&#xff0c;需要引入ZBar第三方库文件&#xff1a; ZBarSDK libqrencode 其次&#xff0c;利用Z…