在Hoare管程中,因为管程是互斥进入的,所以当一个进程试图进入一个已被占用的管程时,应该在管程的入口处等待。为此,在管程的入口处设置了一个进程等待队列,如果出现了P进程唤醒了Q,那么P等待Q执行,如果进程Q执行,又唤醒了进程R,那么Q等待R执行,这就是HOARE语义。因此我们会看到管程中可能会出现多个进程。为了管理这些管程内的等待队列,在管程内就专门设置了一个进程等待队列,这个队列里的进程会比入口等待队列的进程的优先级高。

条件变量

管程的互斥是由编译器保证的,是语言机制。只要考虑怎么样解决同步问题,同步问题是通过条件变量和条件变量上实施waitsignal这两个操作来完成的。所以条件变量是在管程内部说明的,并使用的一种特殊类型的变量。

假设我们设置了声明了一个c作为一个条件变量, 在c上,我们只能够执行wait和signal操作。wait首先它要判断一下 紧急等待队列是不是为空。如果不空,就唤醒紧急等待队列上的第一个等待的进程。因为这个进程马上就要进入条件变量等待,所以它要把管程的互斥权打开。在把管程的互斥权打开之前,先要看一看紧急等待队列是不是有进程,如果有,因为它比入口等待队列进程的优先级高,所以先把它唤醒。否则,如果这个队列是空的,那么就释放管程的互斥权。然后这个进程就进入了条件变量的队列的末尾,称之为c链的末尾。signal执行的时候,是对于一个条件变量上执行操作,所以首先判断c链上是不是有进程在等。如果c链为空,没有进程在等,那么这个操作相当于一个空操作。执行这个操作的进程就可以继续执行下去。但是如果条件变量上这个队列c链上是不空的,就要唤醒其中第一个等待的这个进程。执行这个signal操作的进程就要进入到紧急等待队列的末尾,所以它是把别的进程唤醒了之后,它自己进入紧急等待队列的末尾。