高级操作系统——第十周:同步机制part2

管程

特殊的模块
进程只能通过调用管程中的过程来间接地访问管程中的数据结构

互斥: 管程的互斥性是由编译器负责、保证的
同步:设置条件变量及等待/唤醒操作以解决同步问题
条件变量可能有多个。比如打印机问题,没纸为一个条件变量队列,缺墨为一个条件变量队列
从上面可以理解为,管程中可以有多个程序,但是只能有一个正在执行的程序

当有多个进程同时在管程

当一个进入管程的进程执行等待操作时,它应当释放管程的互斥权当后面进入管程的进程执行唤醒操作时(例如,
P 唤醒Q ),管程中便存在两个同时处于活动状态的进程
如何解决?
三种处理方法:
1:P 等待Q 执行 Hoare
2:Q 等待P 继续执行 MESA
3:规定唤醒为管程中最后一个可执行的操作Hansen ,并发pascal

Hansen

在这里插入图片描述
设置紧急等待队列,用于存储唤醒其他管程的管程
wait© :
如果紧急等待队列非空,则唤醒第一个等待者,否则释放管程的互斥权;执行此操作的进程进入c 链尾部
signal© :
如果c 链为空即条件变量上无进程,类似于yeild,则相当于空操作,执行此操作的进程继续执行;否则唤醒第一个等待者特定条件变量链c下,不用紧急等待队列,执行此操作的进程进入紧急等待队列

如下是解决生产者消费者问题:特点是利用两个条件变量
在这里插入图片描述
优点:因为PsignalV,表示V的条件一定是满足的,所以可以立即执行
缺点:
1:两次额外的进程切换被唤醒进程切,自己切
2:是否会使条件队列中的进程永久挂起当wait进程一直没有进程去signal时

MESA管程

改进一:signal——notify
notify 的结果: 位于条件队列头的进程在将来合适的时候且当
处理器可用时恢复执行
1:由于不能保证在它之前没有其他进程进入管程,因而这个进程
必须重新检查条件用while 循环取代if 语句
2:导致对条件变量至少多一次额外的检测请看hansen的优点1

改进二:
给每个条件原语关联一个监视计时器,不论条件是否被通知,一个等待时间超时的进程将被设置为就绪状态
当该进程被调度执行时,会再次检查相关条件,如果条件满足则继续执行防止饿死

管程的实现

1:利用高级语言自带实现
在这里插入图片描述
在这里插入图片描述
2:自定义
自己制造管程,可以看到管程包括变量的定义和初始化以及方法的定义
在这里插入图片描述
在这里插入图片描述

锁和条件变量

锁:解决互斥机制 lock unlock或者acquire release
条件变量:解决同步机制 signal wait
例子:一个buffer的生产消费问题
注意while(buffer!=0)而不是if(buffer!=0),因为需要重新判断是否满足条件
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值