2.3_11 管程

文章目录

  • 2.3_11 管程
    • (一)为什么要引入管程
    • (二)管程的定义和基本操作
    • (三)拓展1:用管程解决生产者消费者问题
    • (四)Java中类似于管程的机制
  • 总结

2.3_11 管程

image-20240308093616496

(一)为什么要引入管程

  信号量机制存在的问题是——编写程序困难、易出错。

image-20240308094043726

  在我们之前分析的那些同步、互斥问题当中,已经体会到了,我们需要非常关心P、V操作的设计、摆放位置。这就造成编写程序困难、易出错的问题。

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

  1973年,Brinch Hansen首次在程序设计语言(Pascal)中引入了“管程”成分——一种高级同步机制。

  注意:管程的作用,和之前的PV操作一样,同样也是用来实现进程的同步、互斥的,只是它更高级。

(二)管程的定义和基本操作

  管程也是用来实现进程的互斥、同步的。而进程之间之所以需要实现互斥、同步,是因为进程之间可能会共享某些数据资源。

  比如生产者-消费者问题中,生产者、消费者都需要共享地访问缓冲区这种资源。


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

  1.局部于管程的共享数据结构说明;

  比如生产者-消费者问题当中,“缓冲区”就可以用一个数据结构来说明。

  2.对该数据结构进行操作的一组过程

  “一组过程”其实就是“一系列函数”。即,还要给出对刚才的共享数据结构进行操作的一些函数。

  3.对局部于管程的共享数据设置初始值的语句;

  就是对数据结构当中的值进行初始化。

  4.管程的名字。

  注意:管程的上述定义,其实就很像面向对象中的“类”。

管程的基本特征:

  1.局部于管程的数据只能被局部于管程的过程所访问;

  2.一个进程只有通过调用管城内的过程才能进入管程访问共享数据;

  3.每次仅允许一个进程在管程内执行某个内部过程

(三)拓展1:用管程解决生产者消费者问题

image-20240308103417142

  我们可以用程序设计语言提供的相关语法,来定义一个管程。

  如上图(是一个伪代码),monitorend monitor来定义,中间的部分就是管程。在管程中,我们可以定义一些同步变量,如condition full, empty;。还可以定义一些普通变量,用来帮助我们处理,如int count = 0;。在管程中,还定义了两个函数,insert()、remove()

  这样定义好后,生产者进程如果想要生产,消费者进程如果想要消费,就不用再考虑复杂的PV操作,也不需要考虑同步问题、互斥问题,也不用考虑“缓冲区满了怎么办?缓冲区空了怎么办?”这些问题(管程本身就已经解决好了这些问题),而是直接利用管程,调用对应的函数即可,如下图所示。

image-20240308103814335


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

  1.需要在管程中定义共享数据(如生产者消费者问题的缓冲区);

  2.需要在管程中定义用于访问这些共享数据的“入口”——其实就是一些函数(如生产者消费者问题中,可以定义一个函数用于将产品放入缓冲区,再定义一个函数用于从缓冲区中取出产品);

  3.只有通过这些特定的“入口”才能访问共享数据

  4.管程中有很多“入口”,但是每次只能开放其中一个“入口”,并且只能让一个进程或线程进入(如生产者消费者问题中,各进程需要互斥地访问共享缓冲区。管程的这种特性即可保证一个时间段内最多只会有一个进程在访问缓冲区。)注意:这种互斥特性是由编译器负责实现的,程序员不用关心

  5.可在管程中设置条件变量等待/唤醒操作以解决同步问题。可以让一个进程或线程在条件变量上等待(此时,该进程应先释放管程的使用权,也就是让出“入口”);可以通过唤醒操作将等待在条件变量上的进程或线程唤醒。

  程序员可以用某种特殊的语法定义一个管程(比如:monitor ProducerConsumer …… end monitor;),之后其他程序员就可以使用这个管程提供的特定“入口”很方便地实现进程同步、互斥了。

  这也是一种“封装”思想——把一些复杂的细节隐藏了,对外只提供简单易用的接口。

(四)Java中类似于管程的机制

  Java中,如果用关键字synchronized来描述一个函数,那么这个函数同一时间段内只能被一个线程调用。

image-20240308105505331

  每次只能有一个线程进入insert函数,如果多个线程同时调用insert函数,则后来者需要排队等待。

  注:仅作为思维拓展,看不懂也没关系,也不会考。

总结

image-20240308105717571

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

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

相关文章

数位dp 笔记

小技巧1:求区间[X, Y]可以转换为求F(Y) - F(X-1) F(X)表示0~X中满足条件的数字个数 小技巧2:可以用树的形式来看 遍历最高位,每一位分为两种情况:未达到上界和达到上界 如果走到右边最底端需加1 度的数量 求给定区间 [X,Y]中满足下列条件的…

Docker_搭建跨服务器网络通讯(swarm 集群)

本文目录 一、如何搭建docker的跨服务器网络1、在主服务器上初始化docker swarm 集群2、其他服务器节点加入到创建好的集群中3、检验集群是否搭建成功4、创建overlay类型的docker网络 二、如何部署服务1、docker部署2、docker-compose部署 一、如何搭建docker的跨服务器网络 1…

面试软件测试,面试官最想听到的答案是什么?

测试也分三六九等,比较简单就是根据写好的测试案例运行界面,有bug报bug,再好些是知道些测试理念,能根据需求编写测试案例,再好些,能编写各种自动化测试脚本,在此基础上,知道的自动化…

CleanMyMac X4.15中文完整免费版下载

CleanMyMac X是一款功能全面的Mac管理软件,它能帮助用户清理无用的文件,监控系统健康,管理启动项,甚至还能移除恶意软件,确保你的Mac保持最佳状态。其直观的界面设计使得新手用户也能轻松上手,一键扫描和清…

Keepalive+LVS群集部署

引言 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。 一、Keepalive概述 keepalive软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS集群中各个服务节点的状态,后来又加入了可以…

外汇天眼科普:什么是场内交易和场外交易?

场内交易 又称交易所交易,指所有的供求方集中在交易所进行竞价交易的交易方式。 这种交易方式具有交易所向交易参与者收取保证金、同时负责进行清算和承担履约担保责任的特点。 此外,由于每个人都有不同的需求,交易所事先设计出标准化的金融…

第一讲 计算机组成与结构(初稿)

计算机组成与结构 计算机指令常见CPU寄存器类型有哪些?存储器分类?内存?存储器基本组成: 控制器的基本组成主机完成指令的过程以取数指令为例以存数指令为例ax^2bxc程序的运行过程 机器字长存储容量小试牛刀(答案及解析…

Matlab偏微分方程拟合 | 完整源码 | 视频教程

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例完整源码;2.…

5G与智慧文旅的融合发展:推动旅游业转型升级与可持续发展

随着5G技术的飞速发展和广泛应用,其与智慧文旅的融合发展正成为推动旅游业转型升级与可持续发展的重要力量。5G技术以其高速率、低时延、大连接的特性,为智慧文旅注入了新的活力,助力旅游业实现更高效、更智能、更绿色的发展。本文将深入探讨…

AtCoder Beginner Contest 343(A,B,C,D,E,F)

比赛链接 CE是暴力,D是数据结构题,F是线段树。这场的E比较有意思,其他的感觉有点水。 A - Wrong Answer 题意: 给你两个数 A , B A,B A,B ( 0 ≤ A , B ≤ 9 ) (0\le A,B\le 9) (0≤A,B≤9),返回一个个位数&#…

C语言学习--摩尔投票算法

目录 1.引入 2.摩尔投票算法 3.具体步骤 3.1抵消阶段 3.2检验过程 4.代码实现 5.总结 1.引入 今天做题看到一个解题思路真的看不懂&#xff0c;一艘才知道是这个算法。 int majorityElement(int* nums, int numsSize) { int notenums[0]; int count1; for(int i1;i<n…

电源高低温老化测试条件与方法详解

为了检测和确保电源模块在不同温度和恶劣环境下的工作性能&#xff0c;高低温老化测试是不可或缺的测试步骤。高低温老化测试是电子产品制造过程中的重要一环&#xff0c;电源模块高低温老化测试就是为了检测电源模块在高温和低温下是否可以正常工作。 电源高温老化测试方法 高…