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

news/2025/2/19 17:00:52/

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.ppmy.cn/news/33950.html

相关文章

facebook聊单?SaleSmatly来助力

我们生活在一个视觉效果比文字更畅销的世界里,现在非常多企业都在利用Facebook作为其产品和服务的组合。他们正在将流行的社交网络服务变成一个展示平台,以吸引更多客户。更重要的是,使用营销工具可以开始帮助您更高效的进行facebook聊单&…

【LeetCode】剑指 Offer 32. 从上到下打印二叉树 p171 -- Java Version

题目链接:https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/ 举例让抽象问题具体化. 1. 题目介绍(32. 从上到下打印二叉树) 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 【测试…

【绘图】比Matplotlib更强大:ProPlot

✅作者简介:在读博士,伪程序媛,人工智能领域学习者,深耕机器学习,交叉学科实践者,周更前沿文章解读,提供科研小工具,分享科研经验,欢迎交流!📌个人…

基于java下的Springboot框架实现疫情网课管理系统展示

基于java下的Springboot框架实现疫情网课管理系统开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Mav…

nodeBB和flarum个人搭建过程记录

这里先说明nodeBB在某些机器上搭建是失败的,具体原因还未找到,flarum倒是走通了。声明:我是web方面的新手,这个只是因为兴趣爱好,仅仅记录过程。环境:ubuntu22.04nodeBB参考:GitHub - NodeBB/No…

STL中map的下标操作解析

map下标操作的效果展示 STL中&#xff1a;map可以使用下标进行操作&#xff0c;set则不可以。 void TestMap() {map<string, int> m;m.insert(pair<string, int>("苹果", 8));m.insert(pair<string, int>("西瓜", 12));m.insert(pair&…

Vue实战【常用的Vue小魔法】

目录&#x1f31f;前言&#x1f31f;能让你首次加载更快的路由懒加载&#xff0c;怎么能忘&#xff1f;&#x1f31f;你是否还记得有一个叫Object.freeze的方法&#xff1f;&#x1f31f;异步组件那么强&#xff0c;你是不是没用过&#xff1f;&#x1f31f;你是不是还在comput…

【数据仓库-4】-- 提取、转换、装载(ETL)

1.数据抽取 1.1 逻辑抽取 1.1.1 全量数据抽取 一般发生在我们初始化时,需要一次性将源库(业务系统)的所有数据抽取到数据仓库的ODS层。 比如将一个全表导出数据文件或者查询源表所有数据的SQL语句, 都是全量抽取的例子。 select * from user.person; 1.1.2 增量数据抽取 对…