管程(monitor)机制
1973年,Hoare和Hanson提出管程思想:
将共享变量及对共享变量能够进行的所有操作集中在一个模块中。
(把信号量及其操作原语“封装”在一个对象内部)
什么是管程
管程是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。这些共享资源一般是硬件设备或一群变量。
管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计
管程的组成
- 一组局部变量
- 对局部变量操作的一组过程
- 对局部变量进行初始化语句
管程的特点
任何进程只能通过调用管程提供的入口才能进入管程访问共享数据(就比如使用临界资源,就要先通过其信号量的申请)
任何时刻,仅允许一个进程在管程中执行某个内部过程。
管程如何实现同步
1.对共享变量互斥操作:
管程的特点直接实现了该要求,进程一次一个进入管程调用内部过程操作共享变量。
管程的互斥访问完全由编译程序在编译时自动添上,无须程序员关心,能保证正确。
2.操作的同步控制
靠条件变量的操作管理实现。
进入管程但不能获取资源操作的过程将阻塞,并在满足条件时被唤醒执行。
生产者–消费者问题的管程解决方法
管程的优点
保证进程互斥地访问共享变量,并方便地阻塞和唤醒进程。管程可以以函数库的形式实现。相比之下,管程比信号量好控制。
管程可增强模块的独立性:系统按资源管理的观点分解成若干模块,用数据表示抽象系统资源,使同步操作相对集中,从而增加了模块的相对独立性
引入管程可提高代码的可读性,便于修改和维护,正确性易于保证:采用集中式同步机制。一个操作系统或并发程序由若干个这样的模块所构成,一个模块通常较短,模块之间关系清晰。
管程的缺点
多数编程语言中没有实现管程,这样再加入会很困难