进程同步工具之 管程机制
进程同步、进程互斥的两种机制,信号量机制(Semaphores)已总结过了,这里简单总结下另一种机制:管程(Monitor)。
信号量和管程是等价的,即信号量能实现的用管程也能实现,反之亦然。
但管程封装了同步操作,对进程隐蔽了同步细节,简化了同步功能的调用,避免了有意或无意的违法同步操作,给编程带来便利。
引入背景
信号量机制是一种方便有效的进程同步工具。但每次访问临界资源时都需要进程自身进行wait(S)和signal(S)操作。这样,大量的同步操作分散在不同进程中,会给系统管理带来负担,另一方面同步操作使用不当容易导致死锁。
定义
代表共享资源的数据结构(变量),以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序。管程被请求和释放资源的进程所调用。
组成
1.管程的名称
2.局部于管程内部的共享数据结构(变量)说明
3.对该数据结构进行操作的一组过程;
4. 对局部于管程内部的共享数据设置初始值的语句
特点
互斥性:多个进程对管程的访问是互斥的。任一时刻,管程中只能有一个活跃进程。
共享性:管程可被其他进程互斥访问,属于共享资源
安全性:管程的局部变量只能由管程的过程访问,不允许进程或其它管程直接访问,管程也不能访问非局部于它的变量。
封装性:管程内的数据结构是私有的,只能在管程内使用,管程内的过程也只能使用管程内的数据结构。进程通过调用管程的过程使用临界资源。管程在Java中已实现。synchronized 关键字及 wait()、notify()、notifyAll() 这三个方法都是管程的组成部分。
条件变量
考虑情况:当进程调用管程,在管程过程中被阻塞或挂起,若一直不释放管程,则其他进程无法进入,被迫长时间等待。
所以,引入了条件变量(condition)。一个进程被阻塞或挂起的条件(原因)可能多个,因此管程中设置多个条件变量,这些条件变量也只能在管程中访问。
管程中对每个条件变量都须予以说明,其形式为:Var x,y:condition。对条件变量的操作仅仅是 wait 和 signal,因此条件变量也是一种抽象数据类型,每个条件变量保存了一个链表,用于记录因该条件变量而阻塞的所有进程,同时提供的两个操作即可表示为 x.wait和 x.signal。
当进程因x条件被阻塞或挂起,条用x.wait插入x等待队列,释放管程。当x条件发生变化,条用x.signal唤醒被阻塞或挂起的进程。
管程的结构示意图(参考计算机操作系统)