您的位置:首页 > 其它

深入理解l操作系统的管程,进程,线程(一)

2014-09-15 05:36 323 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: