管程

管程管程类型是由程序员定义的一组在管程内互斥操作的类型管程会保证只有一个进程在管程的执行 使得所有的进程都互斥 管程的队列 等待队列 多个 就绪队列 外部等待队列

管程的实现

在这里插入图片描述

管程

Monitors were invented by Per Brinch Hansen[1] and C. A. R. Hoare,[2] and were first implemented in Brinch Hansen’s Concurrent Pascal language.[3]

在信号量机制中,每个要访问临界资源的进程都必须自备同步的PV操作,大量分散的同步操作会给系统管理带来麻烦,且容易因为同步操作不当而导致系统死锁。于是便产生了一种新的进程同步工具——管程(Monitors)。

  • x.wait:正在调用管程的进程因 x 条件需要被阻塞或挂起,则调用 x.wait 将自己插入到 x 条件的等待队列上,并释放管程,直到 x 条件变化。此时其它进程可以使用该管程。
  • x.signal:正在调用管程的进程发现 x 条件发生了变化,则调用 x.signal,重新启动一个因 x 条件而阻塞或挂起的进程。(与信号量的signal不同,没有s:=s+1的操作)

引入管程的原因
信号量机制的缺点:进程自备同步操作,P(S)和V(S)操作大量分散在各个进程中,不易管理,易发生死锁。1974年和1977年,Hore和Hansen提出了管程。

管程特点
管程封装了同步操作,对进程隐蔽了同步细节,简化了同步功能的调用界面。用户编写并发程序如同编写顺序(串行)程序。

引入管程机制的目的

  • 把分散在各进程中的临界区集中起来进行管理;
  • 防止进程有意或无意的违法同步操作;
  • 便于用高级语言来书写程序,也便于程序正确性验证。

管程的定义
管程是由局部于自己的若干公共变量及其说明和所有访问这些公共变量的过程所组成的软件模块。

组成部分

  • 局部于管程的共享变量;
  • 对数据结构进行操作的一组过程;
  • 对局部于管程的数据进行初始化的语句。

管程的属性

  • 共享性:管程可被系统范围内的进程互斥访问,属于共享资源
  • 安全性:管程的局部变量只能由管程的过程访问,不允许进程或其它管程直接访问,管程也不能访问非局部于它的变量。
  • 互斥性:多个进程对管程的访问是互斥的。任一时刻,管程中只能有一个活跃进程。
  • 封装性:管程内的数据结构是私有的,只能在管程内使用,管程内的过程也只能使用管程内的数据结构。进程通过调用管程的过程使用临界资源。管程在Java中已实现。

管程的组成结构

  • 局部数据和条件变量组成管程内的数据结构;
  • 过程/函数1~过程/函数k组成管程内的一组过程对管程内的数据结构进行操作;
  • 初始化代码对管程内的数据结构进行初始化。

管程入口处的等待队列
管程是互斥进入的,所以当一个进程试图进入一个巳被占用的管程时它应当在管程的入口处等待,因而在管程的入口处应当有一个进程等待队列,称作入口等待队列。

管程内的资源等待队列
管程是用于管理资源的,当进入管程的进程因资源被占用等原因不能继续运行时使其等待,即将等待资源的进程加入资源等待队列,该队列由条件变量维护。资源等待队列可以由多个,每种资源一个队列。

条件变量
条件变量(例如名称为c)是管程内的一种数据结构,且只有在管程中才能被访问,它对管程内的所有过程是全局的,只能通过两个原语操作来控制它。
c.wait( )-调用进程阻塞并移入与条件变量c相关的队列中,并释放管程,直到另一个进程在该条件变量c上执行signal( )唤醒等待进程并将其移出条件变量c队列。
c.signal( )-如果存在其他进程由于对条件变量c执行wait( )而被阻塞,便释放之;如果没有进程在等待,那么,信号被丢弃。
条件变量与P、V操作中信号量的区别:
条件变量是一种信号量,但不是P、V操作中纯粹的计数信号量,没有与条件变量关联的值,不能像信号量那样积累供以后使用,仅仅起到维护等待进程队列的作用。因此在使用条件变量x时,通常需要定义一个与之配套使用的整型变量x-count用于记录条件变量x所维护等待队列中的进程数。




管程内的紧急等待队列
当一个进入管程的进程执行等待操作wait时,其它进程应该被允许进入管程;
当一个进入管程的进程执行唤醒操作signal时(如P唤醒Q),管程中便存在两个同时处于活动状态的进程,由于任一时刻,管程中只能有一个活跃进程。所以处理办法为:
1)P等待Q继续,直到Q退出或等待
2)Q等待P继续,直到P等待或退出
3)规定唤醒signal为管程中最后一个可执行的操作




https://baike.baidu.com/item/%E7%AE%A1%E7%A8%8B/?fr=aladdin

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199632.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午12:33
下一篇 2026年3月20日 下午12:34


相关推荐

  • Elastic Search常用命令

    Elastic Search常用命令ES的基本指令:1. 查看es的集群状态:curl ‘IP:9200/_cat/health?v’注释:?v表示格式化输出2. 查看节点列表curl ‘IP:9200/_cat/nodes?v’3.查询所有索引及数据大小curl ‘IP:9200/_cat/indices?v’ 4.创建索引(名称为studentIndex)并指定分片数和备份数curl -XPUT http:/…

    2022年6月24日
    109
  • Initialization failed for ‘https://start.spring.io’ Please check URL, network and proxy settings.

    Initialization failed for ‘https://start.spring.io’ Please check URL, network and proxy settings.

    2021年10月1日
    56
  • rsyslogd 重启_Linux系统rsyslogd服务及启动方法[通俗易懂]

    rsyslogd 重启_Linux系统rsyslogd服务及启动方法[通俗易懂]在CentOS6.x中,日志服务已经由rsyslogd取代了原先的rsyslogd。RedHat公司认为rsyslogd已经不能满足工作中的需求,rsyslogd相比rsyslogd具有一些新的特点:基于TCP网络协议传输日志信息。更安全的网络传输方式。有日志信息的即时分析框架。后台数据库。在配置文件中可以写简单的逻辑判断。与syslog配置文件相兼容。rsyslogd日志服务更加先进,功能更…

    2022年8月15日
    9
  • IntelliJ IDEA、PyCharm订阅满一年永久授权规则(JetBrains 官方提供的永久授权,不是激活成功教程)

    IntelliJ IDEA、PyCharm订阅满一年永久授权规则(JetBrains 官方提供的永久授权,不是激活成功教程)文章目录订阅连续满一年获得永久授权的规则 IntelliJIDEA 的订阅选项价格官网链接 中文页面 之前我一直以为订阅 IntelliJIDEA 包括 JetBrains 其它的软件 是按年付费 如果某一年没付费就不能使用 IntelliJIDEA 了 但了解后发现不是这样的 其实 IntelliJIDEA 只要订阅满一年 就能获取当前版本的永久授权 详细的规则官网写了 我这整理了一下 下文信息来源于 JetBrains 官网 永久授权规则适用于 JetBrains 如下所有的软件 订阅连续满一年获得永久授

    2026年3月27日
    2
  • java static关键字的作用_java中static关键字的作用是什么

    java static关键字的作用_java中static关键字的作用是什么java中static关键字的作用:1、java中可以通过statin关键字修饰变量达到全局变量的效果;2、static修饰的方法属于类方法,不需要创建对象就可以调用;3、static代码块常用于初始化静态变量。本文操作环境:windows10系统、java1.8、thinkpadt480电脑。java中static关键字的作用:在java语言中有四种使用情况:成员变量、成员方法、代码块和内部…

    2022年7月8日
    23
  • 10个最好的 JavaScript 动画库【值得收藏】

    10个最好的 JavaScript 动画库【值得收藏】前端动画场景需求多众多,面对这么多花里胡哨的动画需求,这里给大家推荐10个比较好用的js动画库,轻松实现各种花里胡哨的动画❤️1.Tween.jsTweenJS是一个简单的JavaS…

    2022年10月15日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号