深入理解l操作系统的管程,进程,线程(一)
2014-09-15 05:36
323 查看
1.管程(monitors)和定义
P,V操作分散在用户程序中,系统无法有效的控制盒管理,而且P,V操作使用不当还会引起系统的死锁,所以产生了新的进程同步工具-------管程。
代表共享资源的数据结构,以及对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个OS的资源管理模块,我们称之为管程。
管程由以下几个部分组成。
一:管程的名称
二:局部于管程内部的共享数据结构说明
三:对该数据结构进行操作的过程
四:对局部于管程内部的共享数据结构设置初始值的语句(一段代码)
五:条件变量
其中有三点需要注意:
一:进程互斥的使用管程,管程被进程调用
二:局部于管程内的数据结构,只能被管程的过程所访问,同时,管程内的过程,也只能访问局部于管程内的数据结构
三:在管程机制中,有时候引起进程等待。其中wait()表示某种资源占用而被等待,从而堵塞自己的进程,放弃对管程的互斥权,signal()表示重新启动一个被堵塞的进程。
管程的一般描述如下:
===============
2.利用管程解决生产者-消费者(PC)问题
先建立一个管程,名字为procedure-consumer,其中包括2个过程
一:put(item)过程。procedure生产的产品数记为count,当count>=n时,表示缓冲池满,procedure需要等待
二:get (item)过程.。consumer从缓冲池取得产品,当count<=n时,consumer等待。
PC管程描述如下:
producer和consumer的进程如下:
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>
相关文章推荐
- 深入理解操作系统的管程,进程,线程(二)
- 进程和线程更形象和简单的理解 操作系统
- 深入理解Linux操作系统下的守护进程
- 深入理解计算机操作系统——第8章:进程
- 操作系统的进程和线程的相关知识的理解
- 操作系统中作业、进程、线程、管程各自的定义及联系
- <操作系统>进程与线程的有趣理解
- 计算机底层知识拾遗(二)深入理解进程和线程
- 深入理解计算机操作系统——第8章:进程控制
- 操作系统中作业、程序、进程、线程及管程的定义与联系
- 简述操作系统中的作业、进程、线程、管程
- (转)深入理解Linux操作系统守护进程的意义
- 计算机底层知识拾遗(二)深入理解进程和线程
- 操作系统中作业、程序、进程、线程及管程的定义与联系
- 深入理解进程和线程
- 操作系统---->作业、进程、线程、管程、管道概念梳理
- 【学习笔记】【深入解析Windows操作系统(第四版)】【进程、线程】
- 深入理解Linux操作系统守护进程的意义
- 深入理解Linux操作系统守护进程的意义
- 深入理解Activity启动模式(一)–Activity与进程,线程的关系