管程-第三十三天

目录

为什么要引入管程

管程的定义和基本特征

用管程解决生产者消费者问题

结论

本节思维导图


为什么要引入管程

原因:在解决进程的同步与互斥问题时,信号量机制存在编写困难和易出错的问题

能不能设计一种机制,让程序员写程序时不再需要关注复杂的PV操作,让写代码更轻松呢

 ”管程“:一种更高级同步机制

管程的定义和基本特征

管程是一种特殊的软件模块,由以下部分组成:

  1. 局部于管程的共享数据结构说明
  2. 对该数据结构进行操作的一组过程(”过程“即”函数“)
  3. 对局部于管程的共享数据设置初始值的语句
  4. 管程有一个名字

 管程的基本特征:

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

用管程解决生产者消费者问题

empty和full是标志信号量用于解决同步问题 

N为缓冲区的大小

情况一:两个生产者并发执行,依次调用了insert过程

        当生产者一调用insert进程时,生产者二想要调用insert进程时会被编译器阻塞(即管程解决生产者消费者问题时,是利用编译器实现各进程互斥地进入管程中地过程)

情况二: 两个消费者进程先执行,生产者后执行

        由于缓冲区中产品初始值为0,所以两个消费者进程在并发执行remove函数时都会在wait(empty)处阻塞,然后被挂在等待队列中,此时生产者进程将自己生产的产品放入缓冲区(insert_item(item))(缓冲区中还能放下新生产的产品)然后判断此时新产品是否是缓冲区中的唯一一个产品(如果是则说明可能会有消费者在等待新产品的生产,此时唤醒排在empty等待队列队头的消费者进程)然后count--,在消费者进程拿走产品前会判断缓冲区在自己拿走产品之前是否已经满了(如果已经满了,证明此时需要唤醒生产者进程去生产因拿走产品导致的缓冲区出现的空位)最后消费者进程拿走产品(最后肯定能拿走,但是拿走之前你得让之前那些因为缓冲区满了而停工的生产者继续生产)

结论

引入管程的目的就是要更方便地实现进程互斥和同步:

  1. 需要在管程中定义共享数据(生产者消费者问题中的缓冲区)
  2. 需要在管程中定义用于访问这些共享数据的”入口”,即函数(生产者消费者问题中,可以定义一个函数用于将产品放入缓冲区,再定义一个函数用于从缓冲区取出产品)
  3. 只有通过这些特定的“入口”才能访问共享数据
  4. 管程中有很多“入口”,但是每一次只能开放其中一个“入口”,并且只能让一个进程或线程进入(生产者消费者问题中,各进程需要互斥地访问共享缓冲区,管程地这种特性即可保证一个时间段内最多只会有一个进程在访问缓冲区,这种互斥特性是由编译器负责实现地,程序员不需要关心)
  5. 可在管程中设置条件变量及与之相关的等待/唤醒操作以解决同步问题。可以让一个进程或线程在条件变量上等待(此时,该进程应先释放管程地使用权,也就是让出“入口”):可以通过唤醒操作将等待在条件变量上地进程或线程唤醒

        程序员可以用某种特殊地语法定义一个管程,之后其他程序员就可以使用这个管程提供地特定“入口”很方便地实现了进程地同步和互斥了(封装思想)

本节思维导图

~over~

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

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

相关文章

MySQL常见面试题总结

1.MySQL基础 1.1什么是关系型数据库? 顾名思义,关系型数据库(RDB,Relational Database)就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多…

.NET国产化改造探索(一)、VMware安装银河麒麟

随着时代的发展以及近年来信创工作和…废话就不多说了,这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来,看操作。 安装银河麒麟 麒麟系统分银河麒麟和中标麒麟,我选择的是银河麒麟服务器版的,关于如何下载,…

php ext-sodium 拓展安装 linux+windows

php编译安装(linux),可以参考:php编译安装 一、windows soduim源码包自带,直接修改php.ini,取消extensionsodium注释即可 二、linux 1.安装依赖 apt-get install libsodium-dev2.进入源码目录 这里写自己的源码目录 cd /us…

YOLOv8改进 更换轻量化模型MobileNetV3

一、MobileNetV3论文 论文地址:1905.02244.pdf (arxiv.org) 二、 MobileNetV3网络结构 MobileNetV3引入了一种新的操作单元,称为"Mobile Inverted Residual Bottleneck",它由一个1x1卷积层和一个3x3深度可分离卷积层组成。这个操…

Java基础-----集合类(二)

文章目录 1. 泛型简介2. 使用泛型的好处3.使用泛型3.1 泛型类3.2 泛型接口3.3 泛型方法 4 泛型的通配符4.1 <?>&#xff1a;无边界的通配符4.2 <? extends E>&#xff1a;固定上边界的通配符4.3 <? super E>&#xff1a;固定下边界的通配符 5.总结 今天主…

【React】class组件生命周期函数的梳理和总结(第一篇)

1. 前言 本篇梳理和总结一下React的生命周期函数&#xff0c;方便使用class组件的同学查阅&#xff0c;先上生命周期图谱。 2. 生命周期函数 生命周期函数说明constructor(props) 功能&#xff1a;如果不需要初始化state或不进行方法绑定&#xff0c;class组件可以不用实现构造…

【华为机试】2023年真题B卷(python)-考古问题

一、题目 题目描述&#xff1a; 考古问题&#xff0c;假设以前的石碑被打碎成了很多块&#xff0c;每块上面都有一个或若干个字符&#xff0c;请你写个程序来把之前石碑上文字可能的组合全部写出来&#xff0c;按升序进行排列。 二、输入输出 三、示例 示例1: 输入输出示例仅供…

BLE协议—协议栈基础

BLE协议—协议栈基础 BLE协议栈基础通用访问配置文件层&#xff08;Generic Access Profile&#xff0c;GAP&#xff09;GAP角色设备配置模式和规程安全模式广播和扫描 BLE协议栈基础 蓝牙BLE协议栈包含三部分&#xff1a;主机、主机接口层和控制器。 主机&#xff1a;逻辑链路…

resetlogs失败故障恢复-ORA-01555---惜分飞

客户数据库resetlogs报错 Tue Dec 19 15:21:23 2023 ALTER DATABASE MOUNT Successful mount of redo thread 1, with mount id 1683789043 Database mounted in Exclusive Mode Lost write protection disabled Completed: ALTER DATABASE MOUNT Tue Dec 19 15:22:01 2023…

视频云存储/视频智能分析平台EasyCVR在麒麟系统中无法启动该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

软考证书学下来,对找工作有哪些帮助?

“软考&#xff1f;真的别考”。 “考了半天&#xff0c;到过期了还能没用上&#xff0c;hr根本不看”。 我在豆瓣上看着网友们的评论&#xff0c;心中五味杂陈。 每年有超过100万人参加的考试&#xff0c;却被人吐槽说一无是处&#xff1f; 这种国家级认证的考试&#xff0…

OpenFeign

OpenFeign 一、基本使用 1、引入依赖 <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId><groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-start…