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

来源:互联网 发布:office2016 64位mac 编辑:程序博客网 时间:2024/04/30 14:23

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=monitorVarin,out,count:integer;buffer:array[0...n-1]of item;notfull,notempty:condition;//如果count满了,那么不为满的进程被堵塞,不为空的进程被唤醒procedure  entry put(item)beginif count>=n then notfull.wait;buffer(in):=nextp;in:=(in+1)mod n;count:=count+1;if notempty.queue then notempty.signalend;//如果count为0了,那么不为空的进程被堵塞,不为满的进程被唤醒procedure entry get(item)beginif count<=0 then notempty.wait;nextc:=buffer(out)out:=(out+1)mod n;count:=count-1;if notfull.queue the notfull.signal;end;//局部于管程内部的数据初始化beginin:=out:=count:=0;end;</span>

producer和consumer的进程如下:

<span style="font-size:14px;">producer: beginrepeatproduce an item in nextp;PC.put(item);until false;endconsumer: beginrepeatPC.get(item)consume the item in nextc;until false;end</span>



0 0
原创粉丝点击