信号量机制的不足:
信号量的控制分布在多个进程中:
- 正确性分析困难
- 分散的P、V 操作:易出错,使用不当可能会出现死锁
- 修改、维护困难:易读性差,任一修改都可能影响全局;测试期间发现错误困难,即使发现错误也不容易定位出错位置
管程的组成
- 一组局部变量
- 对局部变量操作的一组过程
- 对局部变量进行初始化的语句
管程的特点
- 任何进程只能通过调用管程提供的过程入口才能进入管程访问共享数据
- 就如同使用临界资源,就要先通过其信号量的申请 - 任何时刻,仅允许一个进程在管程中执行某个内部过程
管程如何实现同步:
- 对共享变量互斥操作
- 管程的特点直接实现了该要求,进程一次一个进入管程调用内部过程操作共享变量。管程的互斥访问完全由编译程序在编译时自动添上,无须程序员关心,能保证正确 - 操作的同步控制
- 靠条件变量的操作管理实现——进入管程但不能获取资源操作的过程将阻塞,并在满足条件时被唤醒执行
管程的同步控制(条件变量)
—— 主要作用就是进程同步的阻塞和唤醒控制 ——
- 普通变量
- 条件变量(用于控制进程阻塞和唤醒)
- 类似信号量变量,但不取具体值;相当于每个阻塞队列的队列指针。
- 对条件变量的操作需结合对普通变量的条件判断,从而控制进程状态
管程的优点:
- 保证进程互斥的访问共享资源,并方便的阻塞和唤醒进程
- 管程可增强模块的独立性
- 可提高代码的可读性,便与修改和维护,正确性易于保证