操作系统原理 —— 什么是管程? 管程的概念以及作用(十六)

news2024/10/6 16:16:45

上一个章节中,我们讲了什么是信号量,如何用信号量来实现进程之间的同步、互斥。

但是吧,用信号量来实现的话,好麻烦哟,在各个进程之间都要大量的 PV 操作,而且操作不当一不小心就死锁了,为了锻炼大家如何更好的使用 PV 操作,其实在进程同步互斥,有几个比较经典的案例,比如说:生产者、消费者问题、多生产者、多消费者问题、吸烟者、读者写者、哲学家进餐等经典用来锻炼进程同步逻辑的问题,当然感兴趣的同学可以自行去学习和了解,我这里就不都说了。

信号量的缺点也比较显而易见,PV操作在各个进程中都需要去实现,不便于管理,容易发生死锁。在 1974 年和 1977 年, Hore 和 Hansen 提出了管程。

什么是管程

说白了,管程也是用来解决进程同步互斥的一种工具,他的操作比信号量更加简单,管程封装了同步操作,对进程隐藏了同步细节。

那管程有什么好处?

1、把分散在各个进程中临界区集中起来进行管理;

2、防止进程有意或者无意的违法同步操作;

3、便于用高级语言来写程序;

说了这些好处,第一次看没理解也是很正常的,只能把管程了解透彻,才能明白它的好处,我们接着往下看。

管程的组成

管程,你可以把它当作一个类看作,一个类里面有啥? 在 Java 类里面可以有属性、构造方法、业务方法,管程它里面也有这些东西。

1、局部于管程的共享变量,这里就可以理解类里面的属性。

2、对数据结构进行操作的一组过程,这里可以理解成业务方法,在方法里面我们可以操作类属性。

3、对局部于管程的数据进行初始化的语句,可以理解为构造方法,初始化属性值。

而且管程还有这么几个特性:

1、管程内的数据,只能被管程里面的方法所访问,管程内部的共享变量对外是不能直接访问的。

2、一个进程只能调用管程中的方法,才能访问管程内的共享数据。

3、每一次,只允许一个进程调用管程内的某个方法。

管程实现互斥、同步

首先我们来用伪代码实现一个管程:

monitor ProducerConsumer
    // 定义条件变量来实现同步
    condition full,empty;
    int count = 0; // 缓冲区中的产品数
    
    // 定义插入的方法
    void insert(Item item){
        if (count == N){
            wait(full)
        }
        count++;
        insert_item(item);
        if(couont == 1){
            signal(empyt)
        }
    }
    
    // 定义移除的方法
    Item remove(){
        if(count == 0){
            wait(empty);
        }
        count--;
        if(count == N-1){
            signal(full);
        }
        return
    }


end monitor

在这里我们定义了一个生产者和消费者的一个管程,里面有两个函数,一个是 insert、一个是 remove,每次 insert 只能有一个进程进行操作,也就是互斥。 消费者必须要等到生产者执行完成之后,消费者才有东西可以消费,这里就是同步。

我们先看互斥,假设现在生产者/消费者的代码如下:

product(){
    item = 有一个新的产品;
    ProducerConsumer.insert(item)
}


consumer(){
   item = ProducerConsumer.remove()
}

在这里,消费者是直接调用了 insert 的函数,如果在这个有多个线程并发的来执行调用 insert 函数这句代码,只会有一个进程能进入,这个是由编译器负责实现各个进程互斥进入管程的过程

而消费数据,管程里面则是利用了 count 属性,以及 P(wait) V(signal) 操作,来控制,必须要生产者先执行 V 操作,消费者才能被唤醒。

其实大家也能看到,管程之所以被说是一个类,是因为管程采用了封装的思想,把复杂的细节隐藏了,我们只需要调用管程提供的特定“入口”就能实现进程同步/互斥了

本章总结

在这里插入图片描述

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

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

相关文章

00后薪资比老油条高,简直无地自容了...

00后带来的压力 公司一位工作3年的老油条工资还没有刚来的00后高,她心中不平,对这件事情有不小的怨气,她觉得自己来公司三年了,三年内迟到次数都不超过5次,每天勤勤恳恳,要加班的时候也愿意加班&#xff0…

Redhat7.3linux系统防火墙命令总结

在Linux系统部署皕杰报表后,需要关闭防火墙或者开放报表工具使用的端口,才能通过浏览器访问报表。 在linux中如何关闭防火墙或开启端口呢?基本上是基于命令操作。通过几天的实践,总结了有关防火墙的操作命令,现记录如…

雅思倒计时一个月|听力准备笔记(二)

首战雅思7.5|听力8.5分享 听力来啦~完整雅思备考攻略见之前发的喔~ 🌟总分7.5 听力8.5 🌟🔴【听力考什么】 雅思实用性很强 每个测试内容都与出国后生活或学习息息相关 听力考察关键信息抓取能力 在日常学…

python4行代码实现pdf转换为docx|python实现pdf与docx之间互转

本期目录 一、pdf转docx二、docx转pdf三、doc转换为docx四、xls格式转换为xlsx五、pdf批量转换成docx六、docx批量转成pdf 一、pdf转docx 将PDF 格式转换为Word格式要求很高,很多的转换网页需要付费、而且转换的效果不好。 在Python中,利用pdf2docx库可…

el-popover无法点击、点击没反应、不能正常唤起弹出框

项目场景: 表格内操作按钮点击后,刷新列表更新按钮显示状态 问题描述 点击更新状态后的那条数据操作按钮。 发现element-ui的el-popover无法点击唤出弹窗,但刷新页面就可以正常点击进行操作。即el-popover刷新列表后无法点击 原因分析&…

5G信道建模研究进展与展望

5G信道建模研究进展与展望 一、信道建模定义二、5G信道建模研究进展1. 5G信道建模的理论框架1.1 大尺度衰落特性1.2 小尺度衰落特性1.3 信道新特性 2. 5G信道测量平台和应用场景2.1 5G信道测量平台2.2 5G信道的应用场景 3. 5G信道特性提取与建模 三、未来6G信道建模的研究方向1…

赛效:如何修改调整GIF动图宽高尺寸

1:在网页上搜索踢踢零动图,在首页点击“GIF尺寸缩放”,进入该功能页面。 2:在操作页面上添加GIF动图。 3:在左侧菜单里设置宽、高,如果不想让动图变形,可以锁定比例。设置完成后,点击…

个人博客系统的测试报告

目录 1.项目背景2.项目功能3.测试计划3.1功能测试3.1.1 测试用例设计3.1.2 实际执行测试的部分操作步骤 3.2自动化测试3.2.1 脑图3.2.2 代码编写 1.项目背景 实现一个类似CSDN的个人博客系统 支持以下核心功能: 支持用户注册登录并设置个人信息如头像、昵称等等; 对…

【事务】MySql Lock wait timeout exceeded该如何处理?service层调用内部方法事务失效如何处理?

文章目录 参考文章问题描述解决办法办法1. 新增查询操作办法2. 判断实际事务场景解决办法 参考文章 MySql Lock wait timeout exceeded该如何处理? AopContext.currentProxy()的使用 问题描述 同一事务内包含对同一条记录进行新增、更新操作,导致mysq…

年薪30W的测试被开除,回怼道:“反正我有技术,在哪不一样”这种观点对吗?

一位年薪30W测试工程师被开除回怼道:“反正我有技术,在哪不一样” 一技傍身,万事不愁,当我们掌握了一技之长后,在职场上说话就硬气了许多,不用担心被炒,反过来还可以炒了老板,这一点…

Hadoop基础学习---4、HDFS写、读数据流程、NameNode和SecondaryNameNode、DataNode

1、HDFS写、读数据流程 1.1 HDFS写数据流程 1.1 剖析文件写入 1、客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。 2、NameNode返回是否可以上传。 3、客户端请求第一个Block上传到哪几…

选择多张图片的方案

适用场景 1、微信公众号开发,代替wx.chooseImage,选择多张图片上传自己服务器; 2、常规的javascript的开发,选择多张图片上传到自己的服务器; 3、扩展到vue和react等框架使用; 整体思路 1、使用input控…

文章百度秒收录方法大全

文章百度秒收录方法大全,百度秒收录?直接套用这个模版创作原创文章#网络营销#案例文章 今天分享几个提高文章质量的简单方法,看一眼就能够操作的。 1、引用金句很多人不知道怎么表达观点,引用金句是一个不错的方法,平时多收集&…

(IDEA)springCloud项目导入本地jar包方法和项目打包时找不到引入本地jar包的问题解决方案

idea导入本地jar包 方法一:点击左上角File–>Project Structure–>Modules。打开Modules界面点击下方号,选择第一项,找到想要导入的本地jar包。此方法可以使项目使用导入的jar包程序不报错,但是在打包项目时,会出现找不到程…

Kyligence Zen使用体验 - 从数据可视化说起

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

SpringBoot JDBC连接数据库项目代码构建

本期引言: 本文将介绍如何使用SpringBoot框架构建一个简单的JDBC连接数据库项目。在这个项目中,我们将使用MySQL作为数据库,通过SpringBoot框架实现数据的增删改查操作。本文将涵盖以下内容: 配置项目所需的环境和工具创建Sprin…

01 Android开机启动之整体分析

Android开机启动之整体分析 一、Android系统整体架构图 Android是谷歌开发的一款基于Linux的开源操作系统 PowerManagement:系统最底层是电源管理,只有通过电源上电,系统才能开启 Linux kernel:驱动层,里面包括Audio、Carmera、usb等各种外设的驱动程序。 HAL层:硬件…

snmp关闭指定网口

一、下载安装MIB Network Management / Network Monitoring / SNMP Monitoring / MIB Browser 1. 选择interfaces->ifTable->ifEntry,右键Table View,如上图所示 2.选择一个你想要设置的网口,点击上方的SNMP SET,弹出窗口 3.OID获取 …

多模态对话语言模型-VisualGLM-6B

多模态对话语言模型-VisualGLM-6B 一、简介二、使用模型推理三、部署工具网页版 DemoAPI部署四、example五、交流一、简介 VisualGLM-6B 是一个开源的,支持图像、中文和英文的多模态对话语言模型,语言模型基于 ChatGLM-6B,具有 62 亿参数;图像部分通过训练 BLIP2-Qformer 构…

【网络】IP协议

文章目录 IP协议预备知识网络层解决的问题如何理解IP地址关于路由器 IP协议格式各个字段的含义IP报头的本质IP如何将报头与有效载荷进行分离IP如何决定将有效载荷交付给上层哪一个协议(如何分用)32位源IP地址和32位目的IP地址重新理解socket编程 分片与组装数据链路层解决的问题…