正在加载图片...
2.管程的特点 从语言的角度看,管程主要有以下特性: (1)模块化。管程是一个基本程序单位,可以单独编译: (2)抽象数据类型。管程是中不仅有数据,而且有对数据的操作: (3)信息掩蔽。管程外可以调用管程内部定义的一些函数,但函数的具体实现外部不 可见: 对于管程中定义的共享变量的所有操作都局限在管程中,外部只能通过调用管程的某些函数来间 接访问这些变量。因此管程有很好的封装性。 为了保证共享变量的数据一致性,管程应互斥使用。管程通常是用于管理资源的,因此管程中 有进程等待队列和相应的等待和唤醒操作。在管程入口有一个等待队列,称为入口等待队列。当 一个已进入管程的进程等待时,就释放管程的互斥使用权:当已进入管程的一个进程唤醒另一个 进程时,两者必须有一个退出或停止使用管程。在管程内部,由于执行唤醒操作,可能存在多个 等待进程(等待使用管程),称为紧急等待队列,它的优先级高于入口等待队列。 因此,一个进程进入管程之前要先申请,一般由管程提供一个enter过程:离开时释放使用权, 如果紧急等待队列不空,则唤醒第一个等待者,一般也由管程提供外部过程1eave。 管程内部有自己的等待机制。管程可以说明一种特殊的条件型变量:varc:condition:实际上 是一个指针,指向一个等待该条件的PCB队列。对条件型变量可执行wait和signal操作: wit(c):若紧急等待队列不空,唤醒第一个等待者,否则释放管程使用权。执行本 操作的进程进入C队列尾部: signal(c):若C队列为空,继续原进程,否则唤醒队列第一个等待者,自己进入紧 急等待队列尾部。 二.实例 I.生产者-消费者问题(有buffer) 问题描述:(见信号量部分) 解答: 管程:buffer=MODULE: (假设已实现一基本管程monitor,提供enter,leave,signal,wait等操作) notfull,notempty:condition; 一notfull控制缓冲区不满,notempty控制缓冲区不空: count,in,out:integer; 一count记录共有几件物品,in记录第一个空缓冲区,out记录第一个不 空的缓冲区 buf:array [0..k-1]of item_type; define deposit,fetch; use monitor.enter,monitor.leave,monitor.wait,monitor.signal;2. 管程的特点 从语言的角度看,管程主要有以下特性: (1)模块化。管程是一个基本程序单位,可以单独编译; (2)抽象数据类型。管程是中不仅有数据,而且有对数据的操作; (3)信息掩蔽。管程外可以调用管程内部定义的一些函数,但函数的具体实现外部不 可见; 对于管程中定义的共享变量的所有操作都局限在管程中,外部只能通过调用管程的某些函数来间 接访问这些变量。因此管程有很好的封装性。 为了保证共享变量的数据一致性,管程应互斥使用。 管程通常是用于管理资源的,因此管程中 有进程等待队列和相应的等待和唤醒操作。在管程入口有一个等待队列,称为入口等待队列。当 一个已进入管程的进程等待时,就释放管程的互斥使用权;当已进入管程的一个进程唤醒另一个 进程时,两者必须有一个退出或停止使用管程。在管程内部,由于执行唤醒操作,可能存在多个 等待进程(等待使用管程),称为紧急等待队列,它的优先级高于入口等待队列。 因此,一个进程进入管程之前要先申请,一般由管程提供一个 enter 过程;离开时释放使用权, 如果紧急等待队列不空,则唤醒第一个等待者,一般也由管程提供外部过程 leave。 管程内部有自己的等待机制。管程可以说明一种特殊的条件型变量:var c:condition;实际上 是一个指针,指向一个等待该条件的 PCB 队列。对条件型变量可执行 wait 和 signal 操作: wait(c):若紧急等待队列不空,唤醒第一个等待者,否则释放管程使用权。执行本 操作的进程进入 C 队列尾部; signal(c):若 C 队列为空,继续原进程,否则唤醒队列第一个等待者,自己进入紧 急等待队列尾部。 -------------------------------------------------------------------------------- 二. 实例 1. 生产者-消费者问题(有 buffer) 问题描述:(见信号量部分) 解答: 管程:buffer=MODULE; (假设已实现一基本管程 monitor,提供 enter,leave,signal,wait 等操作) notfull,notempty:condition; — notfull 控制缓冲区不满,notempty 控制缓冲区不空; count,in,out: integer; — count 记录共有几件物品,in 记录第一个空缓冲区,out 记录第一个不 空的缓冲区 buf:array [0..k-1] of item_type; define deposit,fetch; use monitor.enter,monitor.leave,monitor.wait,monitor.signal;
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有