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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/best_fiends_zxh/article/details/52774241

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

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


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

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

管程有以下特性:

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

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

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

管程的一般结构:

struct Minitor{

    管程内部的变量说明;

    condition  条件变量列表;

    define    函数或方法;

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

    void  函数名(){}

    。。。

    void  函数名(){}

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

    }

};

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

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

汉森方法实现管程:

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

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

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

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



没有更多推荐了,返回首页