【管程】
系统中的各种硬件资源和软件资源,都可用数据结构来抽象地描述其资源特性,即用少量信息和对资源所执行的操作来表征该资源,并忽视其内部结构和实现细节
由于每个要访问的临界资源的进程都要自备 wait(S)
操作与 signal(S)
操作,这就使大量的 $P$、$V$ 操作分散在各个进程中,不仅管理困难,还容易因同步操作顺序不当而产生死锁
为解决这种问题,引入了管程,其是由一组数据以及定义在这组数据之上的对这组数据的操作组成的软件模块,这组操作能够初始化并改变管程中的数据和同步进程
【管程的组成】
管程由以下结构组成:
- 管程名称
- 共享结构数据说明(共享变量、条件变量等)
- 对该数据结构进行操作的一组过程(可调用的方法)
- 对共享数据初始化的语句
其实质上就是一个抽象类,这个抽象类有许多成员变量,系统中任何设备都可以通过这几个成员变量进行区分和描述,同时,这个抽象类中还存在对这些成员变量进行操作的一组成员函数
【管程的同步控制】
管程的变量有两种,一种是普通变量,一种是条件变量
其中,条件变量用于控制进程阻塞与唤醒,其类似于信号量变量,但其没有具体值,相当于每个阻塞队列的队列指针
管程中的每个条件变量都必须予以说明,其形式为:condition x,y
,而对条件变量的操作,需要结合对普通变量的条件判断,由此来控制进程状态
对条件变量的操作只有 wait
与 signal
,因此条件变量是一种抽象的数据类型,每个条件变量只保留了一个链表,用于记录因该条件变量而阻塞的所有进程,因此,两个操作可表示为:
x.wait
:将执行进程挂到x
对应的等待队列上x.signal
:唤醒x
相应的等待队列上的一个进程