管程

(简单了解即可)

信号量机制功能强大,是一种既方便、又有效的进程同步机制,但是在使用过程中对信号量的操作分散在各个进程中,不易控制。

管程」是由过程、变量及数据结构等组成,它们共同构成了一个特殊的模块或软件包。进程可以在任意时刻调用管程中的过程,但不允许使用管程外的过程来访问管程内的数据结构。

管程中在任一时刻只能有一个活跃进程,这一特性可以帮助管程有效地实现互斥

基本概念

图像如下

img-2024-04-10 19-31-08.png

与进程的区别

  • 虽然二者都定义了数据结构,但进程定义的是私有数据结构 PCB,而管程定义的是公共数据结构,如条件变量等;
  • 二者都存在对各自数据结构上的操作,但进程是顺序执行的,而管程则是进行同步操作和初始化操作;
  • 进程是为了保证系统并发而设计的,管程则是为了解决共享资源的互斥;
  • 进程通过调用管程中的过程来进行共享数据结构的操作,该过程就表现为进程的子程序,因此进程是主动的,管程是被动的;
  • 进程间可并发,管程作为子程序不能与其调用者并发;进程具有动态性和生命周期,而管程只是一个资源管理模块,供进程调用。

条件变量

在管程中,除了完成互斥外,还要保证能将无法继续运行的进程正确阻塞。因此,需要引入「条件变量」(condition variable)以及对其的一对 wait、signal 操作。

wait

x.wait 表示正在调用管程的进程因 x 条件需要被阻塞或挂起,该进程在执行 wait 操作时将自己插入 x 条件的等待队列中,并释放管程。此时其它进程可以使用该管程完成自身工作,当 x 条件产生变化时,系统调度程序将选择等待队列中的一个进程继续执行。

signal

x.signal 表示正在调用管程的进程发现 x 条件发生了变化,则使用 signal 操作唤醒一个因 x 条件被阻塞或挂起的进程。

当一个管程中的过程发现自身无法运行下去(如生产者进程发现缓冲池满)时,它将对某个条件变量(如 full)执行 wait 操作。该操作会阻塞调用进程自身,并将其它在管程外等待的进程调入管程。