管程机制
将共享变量及操作共享变量的所有方法封装在一个模块中。
管程组成
- 一组局部变量(共享变量)
- 操作局部变量的一组方法
- 局部变量的初始语句
管程的特点
- 任何进程只能通过管程提供的入口才能访问共享数据
- 任何时刻只允许一个进程访问管程的某个方法
管程如何实现同步控制
- 对共享变量的互斥操作:
管程的特点决定了对共享资源的互斥操作,管程同一时刻只允许一个进程对共享资源进行操作 - 操作的同步控制:
管程通过条件变量实现同步控制,管程同一时刻只允许一个进程获得操作权,没有获得操作权的进程将阻塞在条件变量x的等待队列中,当条件变量发生变化时再由别的进程唤醒在x变量上等待的进程。
条件变量
&emsp: 管程中有一个条件变量,条件变量与一个等待队列,用于存储等待在该条件的进程,对条件变量的操作有wait和signal。当某个进程发现自己无法运行时调用wait方法,将自己放入等待队列并阻塞,将另一个等待在管程之外的进程调入管程。别的线程发现条件发生改变时调用signal方法唤醒等的进程。
当管程中出现多个进程时怎么办(P唤醒Q线程)?
- P等待Q继续,直到Q 退出
- Q等待P继续,直到P退出
- 唤醒管程中最后一个可以执行的进程
管程的优点
- 保证了共享资源访问的互斥性,同时便于等待或唤醒进程
- 将系统按照资源管理的观点拆分成多个模块,每个模块维护该资源,并控制对资源的访问。将对资源的操作集中在一起。
- 对资源的集中管理方便系统的维护。同时增强了模块的易读性。
缺点
- 很多编程语言没有实现管程