(简单了解即可)
「管程」是由过程、变量及数据结构等组成,它们共同构成了一个特殊的模块或软件包。进程可以在任意时刻调用管程中的过程,但不允许使用管程外的过程来访问管程内的数据结构。
管程中在任一时刻只能有一个活跃进程,这一特性可以帮助管程有效地实现互斥。
图像如下
在管程中,除了完成互斥外,还要保证能将无法继续运行的进程正确阻塞。因此,需要引入「条件变量」(condition variable)以及对其的一对 wait、signal 操作。
x.wait
表示正在调用管程的进程因 x
条件需要被阻塞或挂起,该进程在执行 wait
操作时将自己插入 x
条件的等待队列中,并释放管程。此时其它进程可以使用该管程完成自身工作,当 x
条件产生变化时,系统调度程序将选择等待队列中的一个进程继续执行。
x.signal
表示正在调用管程的进程发现 x
条件发生了变化,则使用 signal
操作唤醒一个因 x
条件被阻塞或挂起的进程。
当一个管程中的过程发现自身无法运行下去(如生产者进程发现缓冲池满)时,它将对某个条件变量(如 full
)执行 wait
操作。该操作会阻塞调用进程自身,并将其它在管程外等待的进程调入管程。