在操作系统的并发控制教学中,管程(Monitor)与线程是两个核心概念。管程提供了一种高级的同步机制,而线程则是调度的基本单位。然而,许多学习者会发现:Linux 系统中似乎“没有管程”,而 Windows 等其他操作系统也很少直接以“管程”命名一个内核组件。那么,管程到底存在于哪里?哪些系统或语言真正实现了管程?本文结合系列对话,梳理管程与线程的关系、管程在操作系统中的实现方式,以及编程语言中对管程的原生支持。
一、管程与线程的基本概念
1. 管程的组成与执行过程
管程是一种用于管理共享资源、实现进程/线程互斥与同步的程序结构。它通常由四个部分组成:
- 管程名:唯一标识。
- 局部于管程的变量说明:描述共享数据结构。
- 若干过程:操作共享数据的函数(临界区代码)。
- 初始值语句:初始化内部变量。
在执行时,每次只允许一个进程/线程进入管程,其他调用者必须等待。当线程因资源不足需要等待时,管程会使用条件变量(Condition Variable)及其wait原语将线程排入等待队列;当资源释放后,使用signal唤醒队首线程。这种机制自动保证了互斥,避免了信号量使用不当带来的风险。