我们通过信号量解决同步问题,而信号量存在程序编写困难或效率低下的问题。于是发明了管程,将信号量的这些组织工作交给一个专门的构造来管。管程(monitor)意为监视器,它监视的是进程或线程的同步操作。
管程就是一组子程序,变量和数据的组合,即你把需要同步的代码用一个管程的构造框起来。
注意:进程只能互斥的使用管程,即当一个进程使用管程时,另一个进程必须等待。当一个进程使用完管程后,它必须释放管程并唤醒等待管程的某一个进程。
管程的条件变量(c):
条件变量c实际是一个指针,它指向一个等待该条件的PCB队列。它只有在管程内才能被访问,它对管程内所有过程是全局的,只能通过wait(),signal()两个操作来访问。
如:notfull表示缓冲区不满,如果缓冲区满,那么将要在缓冲区写入数据的进程就要等待notfull,即wait(notfull);相应地,如果一个进程在缓冲区内读数据,当它读完一个数据后,要执行signal(notempty),表示已经释放了一个缓冲区单元。
wait(c):
挂起调用进程并释放管程,直至另一进程在条件变量上执行signal()。
wait(c)表示为进入管程的线程分配某种类型的资源,如果此时这种资源可用,那么进程使用,否则进程被阻塞,进入队列。
signal(c):
如果有其他进程因对条件变量执行wait()而被挂起,便释放之,