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