管程
信号量机制存在的问题
编写程序困难,容易出错。因此人们考虑使用另外设计的机制,保证程序员在编写程序过程中不需要关注复杂的PV操作。
管程的定义和组成
管程是一种特殊的软件模块,其组成部分为:
- 局部与管程的共享数据结构(类似于局部变量的概念,该数据结构只能被管程所访问)
- 对该数据结构进行操作的一组过程(类似于局部方法)
- 对局部于管程的共享数据设置初始值的语句(初始化方法)
- 管程的名字
管程的基本特征
- 局部与管程的数据只能被局部与管程的过程(方法)所访问
- 一个进程只有通过调用管程内的方法,才能进入管程并访问共享数据
- 每次仅允许一个进程在管程内执行某个内部过程(方法)
管程示例
这个过程中由编译器负责实现各个进程互斥的进入管程中的方法
注意
- 引入管程的目的无非是为了更方便的实现进程的互斥与同步
- 需要在管程中定义共享数据(例如生产者消费者问题中的缓冲区)
- 需要在管程中定义用于访问共享数据的“入口”,即函数
- 只有通过管程中定义的方法才能进入管程,才能访问共享数据
- 管程存在很多方法,但每次只能开放其中一个方法作为“入口”,并且只允许一个进程或线程进入(这种互斥的特性是由编译器实现的,程序员不需要关心)
- 可在管程中设置条件变量以及等待/唤醒操作来解决进程同步问题
- 管程体现了一种封装思想,将复杂的PV操作进行封装方便程序设计人员使用