操作系统(2.4.5)--管程机制

1.管程的定义

利用共享数据结构抽象地表示系统中的共享资源,而把对该共享数据结构实施的操作定义为一组过程进程对共享资源的申请、释放和其它操作,都是通过这组过程对共享数据结构的操作来实现的,这组过程还可以根据资源的情况,或接受或阻塞进程的访问,确保每次仅有一个进程使用共享资源,这样就可以统一管理对共享资源的所有访问,实现进程互斥。

代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个操作系统的资源管理模块,我们称之为管程。管程被请求和释放资的进程所调用Hansan为管程所下的定义是:“一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构.上k)的一 -组操作, 这组操作能同步进程和改变管程中的数据”。

管程由四部分组成:

①管程的名称;

②局部于管程内部的共享数据结构说明

③对该数据结构进行操作的一组过程;

④对局部于管程内部的共享数据设置初始值的语句

操作系统一书中管程的示意图

共享数据、一组操作过程、初始化代码、 

Monitor monitor_ name {/*管程名*/
share variable declarations;/*共享变量说明*/
cond declarations; /*条件变量说明*/
public:/*能被进程调用的过程*/
void P1(.......)/*对数据结构操作的过程*/
{.......}
vold P2(......)
{......}
......

{                    /*管程主体*/
initialization code;/*初始化代码*/
}

注意:

局部于管程内部的数据结构,仅能被局部于管程内部的过程所访问,任何管程外的过程都不能访问它;反之,局部于管程内部的过程也仅能访问管程内的数据结构。
由此可见,管程相当于围墙,它把共享变量和对它进行操作的若干过程围了起来,所有时,都必须经过管程(相当于通过围墙的进程要访问临界资源门)才能进入,而管程每次只准许一个进程进入管程,从而实现了进程互斥。

管程主要有以下特性:
(1)模块化。管程是一个基本程序单位,可以单独编译。
(2)抽象数据类型。管程中不仅有数据,而且有对数据的操作。
(3)信息掩蔽。管程中的数据结构只能被管程中的过程访问,供管程外的进程调用,而管程中的数据结构以及过程(函数)的具体实现外部不可见。

管程和进程不同,主要体现在以下几个方面:
(1)虽然二者都定义了数据结构,但进程定义的是私有数据结构PCB管程定义的是公共数据结构,如消息队列等;
(2)二者都存在对各自数据结构上的操作,但进程是由顺序程序执行有关的操作,而管程主要是进行同步操作和初始化操作;

(3)设置进程的目的在于实现系统的并发性,而管程的设置则是解决共享资源的互斥使用问题;
(4)进程通过调用管程中的过程对共享数据结构实行操作,该过程就如通常的子程序一样被调用,因而管程为被动工作方式,进程则为主动工作方式;
(5)进程之间能并发执行,而管程则不能与其调用者并发;
(6)进程具有动态性,由“创建”而诞生,由“撤销”而消亡,而管程则是操作系统中的一个资源管理模块,供进程调用

2.条件变量 

考虑一种情况:当一个进程调用了管程,在管程中时被阻塞或挂起,直到阻塞或挂起的原因解除,而在此期间,如果该进程不释放管程,则其它进程无法进入管程,被迫长时间地等待。为了解决这个问题,引入了条件变量condition。通常,个进程被阻塞或挂起的条件(原因)可有多个,因此在管程中设置了多个条件变量,对这些条件变量的访问,只能在管程中进行。

管程中对每个条件变量都须予以说明,其形式为: condition x,y。
对条件变量的操作仅仅是wait和signal,每个条件变量保存了一个链表,用于记录因该条件变量而阻塞的所有进程,同时提供的两个操作即可表示为x.wait和x.signal,其含义为:
①x.wait:正在调用管程的进程因x条件需要被阻塞或挂起,则调用x.wait将自己插入到x条件的等待队列上,并释放管程,直到x条件变化。
②x.signal:正在调用管程的进程发现x条件发生了变化,则调用x.signal重新启动一个因x条件而阻塞或挂起的进程。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yolov8训练筷子点数数据集

序言 yolov8发布这么久了,一直没有机会尝试一下,今天用之前自己制作的筷子点数数据集进行训练,并且记录一下使用过程以及一些常见的操作方式,供以后翻阅。 一、环境准备 yolov8的训练相对于之前的yolov5简单了很多,…

【链表OJ题(九)】环形链表延伸问题以及相关OJ题

环形链表OJ题 1. 环形链表 链接:141. 环形链表 描述: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环&…

简单分析Linux内核基础篇——initcall

写过Linux驱动的人都知道module_init宏,因为它声明了一个驱动的入口函数。 除了module_init宏,你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数,而是看到了许多诸如以下的声明: static int __init qco…

Java之类与对象(图文结合)

目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象与面向过程 二、类定义和使用 1、简单认识类 2、类的定义格式 3、练习 (1)定义一个狗类 (2)定义一个学生类 三、类的实例化 1、什么是实例化 2、类和对象的…

CSDN 周赛38期题解

CSDN 周赛38期题解1、题目名称:代写匿名信2、题目名称:寻因找祖3、题目名称:小Q新式棋盘4、题目名称:拯救公主结束语1、题目名称:代写匿名信 小Q想要匿名举报XX领导不务正业! 小Q害怕别人认出他的字迹。 他…

【数据结构】Java实现双向链表

目录 1. 接口的实现 2. 动手实现双链表 2.1 重写SeqList接口方法 2.2 在当前链表尾部添加节点(尾插) 2.3 在当前链表头部添加节点(头插) 2.4 检验index是否合法 2.5 在 第index位置添加节点(任意位置) 2.6 …

【精品】华为认证数通HCIA+HCIP题库分享(含答案解析)

嗨~大家好久不见,我是薄荷学姐,随着华为业务也全球领域的迅猛发展,越来越多人开始重视华为认证的重要性。今天给大家分享一下去年8月份的题库,基本都是一样,希望可以帮助到大家哈想要通过华为认证,除了进行…

gdb调试工具和makemakefile工具

gdb调试工具和make/makefile工具 文章目录gdb调试工具和make/makefile工具一、gdb调试工具1.debug/release2.使用二、make/makefile1.什么是make/makefile2.编写一、gdb调试工具 1.debug/release 程序有两种默认的发布方式debug和release。release是无法进行调试的。Linux中g…

Bing+ChatGPT 对传统搜索引擎的降维打击

早些时候申请了新版 Bing 的内测资格,终于收到了通过的邮件。 一天的体验之后,我的感受是:当新版 Bing 具备了 ChatGPT 的聊天能力之后,它的能力不论是对传统搜索引擎,还是 ChatGPT 自身,都将是降维打击。 …

菜鸟刷题Day3

⭐作者:别动我的饭 ⭐专栏:菜鸟刷题 ⭐标语:悟已往之不谏,知来者之可追 一.字符串压缩:面试题 01.06. 字符串压缩 - 力扣(LeetCode) 描述 字符串压缩。利用字符重复出现的次数,编…

Python程序员看见一个好看的手机壁纸网站,开撸!

人生苦短,我用python 最近好像没什么大事, .那就采集一下小——姐——姐————看下吧~ python 安装包资料:点击此处跳转文末名片获取 最近有同学的爬虫代码出了bug,给问我怎么改 于是就发现了这个好看的手机壁纸网站。 这个图片应该是违规…

【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用

【Unity工具,简单学习】PUN 2,多人在线网络工具前言简单介绍安装简单使用一些 nomenclature 部分连接到 Server设置简单的大厅UI游戏场景搭建关卡加载事后前言 链接 简单介绍 PUN 可以让你简单地开发多人游戏,在全球范围推出 让开发者不用…

【Java学习笔记】38.Java 发送邮件

Java 发送邮件 使用Java应用程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) 。 您可以从 Java 网站下载最新版本的 JavaMail,打开网页右侧有个 Downloads 链接,点击它下载。 您…

MySQL注入秘籍【上篇】

MySQL注入秘籍【上篇】1.数据库敏感信息常用语句2.联合(UNION)查询注入3.报错注入原理常见报错注入函数1.数据库敏感信息常用语句 获取数据库版本信息 select version(); select innodb_version;获取当前用户 select user();获取当前数据库 select database();数…

高数重点总结

高数 公式不要去死记 配合训练题在训练中记忆 完成一下这些题目 高中函数图像回忆 与其记忆各种公式不如去思考他们的本质 这和调用c动态库可不一样 考试的时候你相当于在使用汇编答题 1 定义域(x) 性质 1/x(x!0)√x(x>0 || x0)log a x (x>…

血氧仪是如何得出血氧饱和度值的?

目录 一、血氧饱和度概念 二、血氧饱和度监测意义 三、血氧饱和度的监测方式 四、容积脉搏波计算血氧饱和度原理 五、容积脉搏波波形的测量电路方案 1)光源和光电探测器的集成测量模块:SFH7050—反射式 2)模拟前端 六、市面上血氧仪类型…

Spring 源码解析 - Bean创建过程 以及 解决循环依赖

一、Spring Bean创建过程以及循环依赖 上篇文章对 Spring Bean资源的加载注册过程进行了源码梳理和解析,我们可以得到结论,资源文件中的 bean 定义信息,被组装成了 BeanDefinition 存放进了 beanDefinitionMap 容器中,那 Bean 是…

图形视图框架QGraphicsScene(场景,概念)

QGraphicsScene 该类充当 QGraphicsItems 的容器。它与 QGraphicsView 一起使用,用于在 2D 表面上可视化图形项目,例如线条、矩形、文本甚至自定义项目。 QGraphicsScene具有的功能: 提供用管理大量数据项的高速接口传播事件到每一个图形项…

艹,终于在8226上把灯点亮了

接上次点文章ESP8266还可以这样玩这次,我终于学会了在ESP8266上面点亮LED灯了现在一个单片机的价格是几块,加上一个晶振,再来一个快递费,十几块钱还是需要的。所以能用这个ESP8266来当单片机玩,还是比较不错的可以在ub…

【设计模式】创建型设计模式

文章目录1. 基础①如何学习设计模式② 类模型③ 类关系2. 设计原则3. 模板方法① 定义②背景③ 要点④ 本质⑤ 结构图⑥ 样例代码4. 观察者模式① 定义②背景③ 要点④ 本质⑤ 结构图⑥ 样例代码5. 策略模式① 定义②背景③ 要点④ 本质⑤ 结构图⑥ 样例代码1. 基础 ①如何学习…
最新文章