管程机制处理进程同步问题

进程同步机制有很多,主要有PV操作和信号量,管程,以及消息传递等。

由于PV操作的使用分散在各个进程之中,不利于对临界资源的统一管理,还有PV操作的使用需要小心,若顺序不对,或忘一个没写,很容易陷入死锁,所以,管程就能解决上面问题。


管程的基本思路是:将分散在各个进程中的临界区集中起来进行统一控制和管理,并且将系统中的共享资源用数据结构抽象的描述出来,然后对临界区的访问通过管程进行统一管理

管程:就是由若干个数据结构、变量,以及方法(函数)所组织成的一种特殊的结构。

管程有以下特性:

①互斥性,任何时刻只能最多一个进程进入管程活动,其他想进入管程必须等待。

②安全性,管程中的局部变量只能由管程的方法或函数来访问,其他进程或管程是不能够对该局部变量进行直接访问

③共享性,管程中的特定的方法或函数可以被其他管程或进程访问,这样的方法或函数应该有特殊说明。

管程的一般结构:

struct Minitor{

    管程内部的变量说明;

    condition  条件变量列表;

    define    函数或方法;

    use    函数或方法;    外部函数,直接使用

    void  函数名(){}

    。。。

    void  函数名(){}

    void init(){ 对管程中的局部变量进行初始化;

    }

};

在管程有一类特殊的变量称为条件变量,即condition变量。由于管程的访问具有互斥性,所以要引入条件变量,条件变量是管程的一种特殊的数据结构,在条件变量有两个相关操作wait()和signal()。他们都是原语,不可被打断

执行wait()原语的进程被阻塞,同时开放管程,将当前进程排在某条件变量的等待队列中,执行signal()原语,唤醒在对应条件变量的上的进程。

汉森方法实现管程:

wait()原语:即等待原语,当一个进程由于自身原因进行不下去了,就执行该原语,从而开放管程,自己进入阻塞态。

signal()原语:唤醒在相应条件变量上的等待进程队列的一个进程,执行signal()的进程要立即离开管程。

check()原语:检查管程是否可用,若可用,则进入,不可用,则进入等待调用状态。

release()原语:检查是否有等待调用的进程,若有,则唤醒该进程,无,则开放管程。



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值