操作系统原理,使用管程封装操作系统共享资源,hoare管程模型与mesa管程模型

本文深入探讨操作系统中管程的概念,解释为何引入管程以封装共享资源,对比Hoare管程和Mesa管程的异同,重点分析两者在互斥与同步上的处理方式,以及如何解决并发控制中的问题。
摘要由CSDN通过智能技术生成

操作系统原理,使用管程封装操作系统共享资源,hoare管程模型与mesa管程模型

O、进程中信号量机制的不足:程序编写困难、容易出错
引入管程,管程也是一种进程间的高级同步机制。

一、管程定义:

有一个明确定义的操作集合,通过它且只能通过它才能操作某共享数据类型的实例。

分析:
1、这里管程这个机制维护了共享资源的数据结构和操作过程,等价于c++中将数据结构和函数封装为一体的类
2、参考同一进程中的多个线程可以共享数据,往底层看,操作系统和进程的关系就像进程和进程内线程的关系,操作系统的视角中共享资源等价于进程中的全局变量。

二、进程和管程的调用关系:
进程只能通过管程中的过程(函数)来间接的访问管程中的数据。
从c++编程的角度看,就像是用一个类封装了一个数据结构(共享资源),并将外界和此数据结构隔离开,只向外暴露有限的接口并隐藏功能的实现过程,内部进行了安全性保密性之类的实现,提高内聚性以及外界的易用性。

三、管程封装了共享资源后需要解决的问题:
管程封装的共享资源并向进程提供了接口,进程内部就不再需要考虑互斥同步的问题,提高了应用层编码的易用性,这些问题转移到管程中解决,所以管程要解决的问题仍然是互斥和同步。
1、互斥
管程对外提供的接口对共享资源的利用需要是互斥进入的,为了保证抽象自共享资源的数据结构的数据完整性。
管程的互斥性由编译器负责保证。
2、同步
管程中设置条件变量(数据结构)和等待/唤醒(函数)解决同步问题。
管程可以让一个进程或线程在条件变量处等待,并释放共享资源的使用权;也可以通过发送信号将等待在条件变量上的进程或线程唤醒。

四、应用管程会遇到的问题:
管程代理了共享资源,性质上等价于临界区,当一个进程在管程中进入等待,如进程A在管程中等待进程B唤醒,B进入管程运行到唤醒进程A的地方,此时管程中就同时存在两个处于活动状态的进程了,但管程拥有和临界区相似的性质,不允许两个进程同时运行。
解决方法:
1、A醒了,等待B运行出管程(Hoare提出的,所以叫hoare管程)
2、A醒了,B等待A运行出管程,但A不会在管程中的条件变量处等待,而是在其他等待队列中等待。(mesa提出的,所以叫mesa管程)
3、规定:唤醒操作是管程中的最后最后一个可执行操作,确保唤醒以后本进程离开管程,保证了管程中只有一个进程。(hansen提出的,所以叫hanse管程)

五、Hoare管程模型()
1、进程A先进入管程,获取到共享资源使用权并调用过程,因缺少必要条件,进程A让出共享资源,等待于条件变量处,
2、进程B进入管程,满足了条件并唤醒了进程A,此时进程B进入管程内部的紧急等待队列中等待。

在这里插入图片描述

入口等待队列和紧急等待队列保证了管程的互斥,条件变量对象和wait/signal方法保证了管程的同步。

六、管程同步:
1、条件变量:管程内部声明和使用的一种特殊类型的变量,并提供wait()和signal()操作
2、Wait©:如果紧急等待队列非空,则唤醒第一个等待者,否则释放管程使用权,这些此操作的进程进入条件变量队列末尾,又叫c链。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值