计算机操作系统——管程

一.什么是管程

1.1973年,Hoare和Hanson提出管程思想:   

 将共享变量及对共享变量能够进行的所有操作集中在一个模块中。

(把信号量及其操作原语“封装”在一个对象内部)    

二.管程的组成

管程需要封装 (1)一组局部变量 (2)对局部变量操作的一组过程(2)对局部变量进行初始化的语句。

三.管程的特点

1.任何进程只能通过调用管程提供的过程入口才能进入管程访问共享数据;

  就如同使用临界资源,就要先通过其信号量的申请。

2.任何时刻,仅允许一个进程在管程中执行某个内部过程。

四.管程的同步控制(条件变量)

1.普通变量

2.条件变量(用于控制进程阻塞和唤醒)

  类似信号量变量,但不取具体值;相当于每个阻塞队列的队列指针。

  对条件变量的操作需结合对普通变量的条件判断,从而控制进程状态。

3.关于条件变量的操作

 x.wait将执行进程挂到x对应的等待队列上;

x.signal唤醒x相应的等待队列上的一个进程。

(signal操作,是重新启动一个被阻塞的进程,但如果没有进程被阻塞,则不产生任何效果 而信号量机制中的signal操作,若没有需要唤醒的进程,必须要做的还有修改信号量变量的值。)

五.管程的优缺点

优点:

(1)保证进程互斥地访问共享变量,并方便地阻塞和唤醒进程。管程可以以函数库的形式实现。相比之下,管程比信号量好控制。

(2)管程可增强模块的独立性:系统按资源管理的观点分解成若干模块,用数据表示抽象系统资源,使同步操作相对集中,从而增加了模块的相对独立性

(3)引入管程可提高代码的可读性,便于修改和维护,正确性易于保证:采用集中式同步机制。一个操作系统或并发程序由若干个这样的模块所构成,一个模块通常较短,模块之间关系清晰。

缺点:

  大多数常用的编程语言中没有实现管程,如果某种语言本身不支持管程,那么加入管程是很困难的。 虽然大多数编程语言也没有实现信号量,但可将P、V操作作为一个独立的子例程或操作系统的管理程序调用加入。

六.生产者-消费者问题管程示例

type p_c=monitor
    var in,out,count: interger;
           buffer: array[0,…,n-1] of item
           x,y: condition; //x:代表没有空这种条件  y:代表没有产品这种条件
procedure entry put(var product:item) //生产者函数
{  if count>=n then x.wait; //进程间的同步靠条件变量的操作实现
    buffer[in]=product;
    in=in+1 mod n;
    count=count+1;
    y.signal;   
}
procedure entry get(var product:item) //消费者函数
{  if count<=0 then y.wait;
    nextc=buffer[out];
    out=out-1 mod n;
    count=count-1;
    x.signal;	
}
{	in=out=0;
	count=0;		
}

 

你可能感兴趣的:(操作系统)