pascal 首先提出了管程的机制,来实现进程同步。

管程的定义和基本特征

管程是一个特殊的软件模块,有这些部分组成:

  1. 局部于管程的共享数据结构说明
  2. 对于这个数据结构进行操作的一组过程
  3. 对局部于管程的共享数据设置初始值的语句

管程的基本特征:

  1. 局部于管程的数据只能被局部于管程的过程(函数)访问
  2. 一个进程只有通过调用管程内的过程(函数)才能进入管程访问共享数据
  3. 每次只允许一个进程在管程内执行内部的过程(函数)

管程如何实现进程同步互斥

管程的伪代码,本质就是对pv操作的封装
image.png
并发调用会进入排队。互斥的进入管程由编译器负责。管程可以有很多入口,并且只能有一个进程或线程访问。
full 和 empty 分别对应 生产者排队的队列和消费者排队队列。

当count==N时,即缓冲区满了,当前生产者进入full生产者等待队列,当一个消费者取走一个产品之后,判断如果count==N-1,表示消费前缓冲区已满,代表可能有生产者等待,会唤醒full队列的生产者。

当count==0时,即缓冲区没有产品,当前消费者进入empty消费者等待队列,当一个生产者生产一个产品之后,判断如果count==1,表示生产前缓冲区为空,代表可能有消费者等待,会唤醒empty队列的消费者。

java中的管程

image.png