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

来源:互联网 发布:excel窗体录入数据 编辑:程序博客网 时间:2024/05/21 17:34

进程同步机制有很多,主要有PV操作和信号量,管程,以及消息传递等。
由于PV操作的使用分散在各个进程之中,不利于对临界资源的统一管理,还有PV操作的使用需要小心,若顺序不对,或忘一个没写,很容易陷入死锁,所以,管程就能解决上面问题。

管程的基本思路是:将分散在各个进程中的临界区集中起来进行统一控制和管理,并且将系统中的共享资源用数据结构抽象的描述出来,然后对临界区的访问通过管程进行统一管理
管程:就是由若干个数据结构、变量,以及方法(函数)所组织成的一种特殊的结构。
管程有以下特性:
①互斥性,任何时刻只能最多一个进程进入管程活动,其他想进入管程必须等待。
②安全性,管程中的局部变量只能由管程的方法或函数来访问,其他进程或管程是不能够对该局部变量进行直接访问
③共享性,管程中的特定的方法或函数可以被其他管程或进程访问,这样的方法或函数应该有特殊说明。
管程的一般结构:
struct Minitor{
管程内部的变量说明;
condition 条件变量列表;
define 函数或方法;
use 函数或方法; 外部函数,直接使用
void 函数名(){}
。。。
void 函数名(){}
void init(){ 对管程中的局部变量进行初始化;
}
};
在管程有一类特殊的变量称为条件变量,即condition变量。由于管程的访问具有互斥性,所以要引入条件变量,条件变量是管程的一种特殊的数据结构,在条件变量有两个相关操作wait()和signal()。他们都是原语,不可被打断
执行wait()原语的进程被阻塞,同时开放管程,将当前进程排在某条件变量的等待队列中,执行signal()原语,唤醒在对应条件变量的上的进程。
汉森方法实现管程:
wait()原语:即等待原语,当一个进程由于自身原因进行不下去了,就执行该原语,从而开放管程,自己进入阻塞态。
signal()原语:唤醒在相应条件变量上的等待进程队列的一个进程,执行signal()的进程要立即离开管程。
check()原语:检查管程是否可用,若可用,则进入,不可用,则进入等待调用状态。
release()原语:检查是否有等待调用的进程,若有,则唤醒该进程,无,则开放管程。

0 0
原创粉丝点击