管程

管程类型是由程序员定义的一组在管程内互斥操作的类型
在这里插入图片描述

管程会保证只有一个进程在管程的执行。(使得所有的进程都互斥)
管程的队列: 等待队列(多个) + 就绪队列 + 外部等待队列

管程的实现

在这里插入图片描述

管程

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)。

管程中包含条件变量,用于管理进程的阻塞和唤醒。
其形式为 condition x;对它的操作仅有wait和signal。

  • 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/10503922?fr=aladdin

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值