信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。因此后来又提出了一种集中式同步进程——管程。其基本思想是将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。
本节将从以下几个方面进行介绍--
--------------------------------------------------------------------------------
一. 管程的概念
1. 管程的形式
2. 管程的特点
--------------------------------------------------------------------------------
二. 实例
1. 生产者-消费者问题(有buffer)
2. 第一类读-写者问题
3. 哲学家问题
--------------------------------------------------------------------------------
一. 管程的概念
1. 管程的形式
管程作为一个模块,它的类型定义如下:
--------------------------------------------------------------------------------
2. 管程的特点
从语言的角度看,管程主要有以下特性:
对于管程中定义的共享变量的所有操作都局限在管程中,外部只能通过调用管程的某些函数来间接访问这些变量。因此管程有很好的封装性。
为了保证共享变量的数据一致性,管程应互斥使用。 管程通常是用于管理资源的,因此管程中有进程等待队列和相应的等待和唤醒操作。在管程入口有一个等待队列,称为入口等待队列。当一个已进入管程的进程等待时,就释放管程的互斥使用权;当已进入管程的一个进程唤醒另一个进程时,两者必须有一个退出或停止使用管程。在管程内部,由于执行唤醒操作,可能存在多个等待进程(等待使用管程),称为紧急等待队列,它的优先级高于入口等待队列。
因此,一个进程进入管程之前要先申请,一般由管程提供一个enter过程;离开时释放使用权,如果紧急等待队列不空,则唤醒第一个等待者,一般也由管程提供外部过程leave。
管程内部有自己的等待机制。管程可以说明一种特殊的条件型变量:var c:condition;实际上是一个指针,指向一个等待该条件的PCB队列。对条件型变量可执行wait和signal操作:
--------------------------------------------------------------------------------
二. 实例
1. 生产者-消费者问题(有buffer)
问题描述:(见信号量部分)
解答:
--------------------------------------------------------------------------------
2. 第一类读-写者问题
问题描述:(见信号量部分)
解答:
--------------------------------------------------------------------------------
3. 哲学家问题
问题描述:(见信号量部分)
解答: