1.管程(monitors)和定义
P,V操作分散在用户程序中,系统无法有效的控制盒管理,而且P,V操作使用不当还会引起系统的死锁,所以产生了新的进程同步工具-------管程。
代表共享资源的数据结构,以及对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个OS的资源管理模块,我们称之为管程。
管程由以下几个部分组成。
一:管程的名称
二:局部于管程内部的共享数据结构说明
三:对该数据结构进行操作的过程
四:对局部于管程内部的共享数据结构设置初始值的语句(一段代码)
五:条件变量
其中有三点需要注意:
一:进程互斥的使用管程,管程被进程调用
二:局部于管程内的数据结构,只能被管程的过程所访问,同时,管程内的过程,也只能访问局部于管程内的数据结构
三:在管程机制中,有时候引起进程等待。其中wait()表示某种资源占用而被等待,从而堵塞自己的进程,放弃对管程的互斥权,signal()表示重新启动一个被堵塞的进程。
管程的一般描述如下:
<span style="font-size:14px;">type<管程名>=monitor
<管程变量说明>;
procedure <过程名>(<形式参数表>);
begin
<过程体>;
end;
.........
procedure <过程名>(<形式参数表>);
begin
<过程体>;
end;
begin
<局部于管程内部的共享数据初始化语句>
end;</span>
===============
2.利用管程解决生产者-消费者(PC)问题
先建立一个管程,名字为procedure-consumer,其中包括2个过程
一:put(item)过程。procedure生产的产品数记为count,当count>=n时,表示缓冲池满,procedure需要等待
二:get (item)过程.。consumer从缓冲池取得产品,当count<=n时,consumer等待。
PC管程描述如下:
<span style="font-size:14px;">type PC=monitor
Var
in,out,count:integer;
buffer:array[0...n-1]of item;
notfull,notempty:condition;
//如果count满了,那么不为满的进程被堵塞,不为空的进程被唤醒
procedure entry put(item)
begin
if count>=n then notfull.wait;
buffer(in):=nextp;
in:=(in+1)mod n;
count:=count+1;
if notempty.queue then notempty.signal
end;
//如果count为0了,那么不为空的进程被堵塞,不为满的进程被唤醒
procedure entry get(item)
begin
if count<=0 then notempty.wait;
nextc:=buffer(out)
out:=(out+1)mod n;
count:=count-1;
if notfull.queue the notfull.signal;
end;
//局部于管程内部的数据初始化
begin
in:=out:=count:=0;
end;</span>
producer和consumer的进程如下:
<span style="font-size:14px;">producer: begin
repeat
produce an item in nextp;
PC.put(item);
until false;
end
consumer: begin
repeat
PC.get(item)
consume the item in nextc;
until false;
end</span>