管程

信号量机制存在的问题

编写程序困难,容易出错。因此人们考虑使用另外设计的机制,保证程序员在编写程序过程中不需要关注复杂的PV操作。

管程的定义和组成

管程是一种特殊的软件模块,其组成部分为:

  1. 局部与管程的共享数据结构(类似于局部变量的概念,该数据结构只能被管程所访问)
  2. 对该数据结构进行操作的一组过程(类似于局部方法)
  3. 对局部于管程的共享数据设置初始值的语句(初始化方法)
  4. 管程的名字

管程的基本特征

  1. 局部与管程的数据只能被局部与管程的过程(方法)所访问
  2. 一个进程只有通过调用管程内的方法,才能进入管程并访问共享数据
  3. 每次仅允许一个进程在管程内执行某个内部过程(方法)

管程示例

这个过程中由编译器负责实现各个进程互斥的进入管程中的方法

注意

  • 引入管程的目的无非是为了更方便的实现进程的互斥与同步
  • 需要在管程中定义共享数据(例如生产者消费者问题中的缓冲区)
  • 需要在管程中定义用于访问共享数据的“入口”,即函数
  • 只有通过管程中定义的方法才能进入管程,才能访问共享数据
  • 管程存在很多方法,但每次只能开放其中一个方法作为“入口”,并且只允许一个进程或线程进入(这种互斥的特性是由编译器实现的,程序员不需要关心)
  • 可在管程中设置条件变量以及等待/唤醒操作来解决进程同步问题
  • 管程体现了一种封装思想,将复杂的PV操作进行封装方便程序设计人员使用