高级操作系统——第十周:同步机制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),因为需要重新判断是否满足条件