绿色系统下载网站,值得信赖的XP系统下载站!
使用信号量机制能够较好地处理进程同步的问题,但是,信号量的许多同步操作分散在各个进程中,如果设置不当,可能会导致系统死锁。在进行信号量设置时,初值的确定以及p、v操作的位置安排都必须正确,否则会造成与时间有关的错误,甚至导致系统死锁。例如,生产者-消费者问题中将p、v操作顺序颠倒可能导致系统死锁。
为了解决这类问题,引入了管程的概念。管程是实现进程同步的另一个有效工具。
1、管程的定义及组成
一个管程定义了一个数据结构和能为并发进程在该数据结构上所执行的一组操作,这组操作能同步进程和改变管程中的数据。
管程由4部分组成,即唯一的管程标识符、局部于管程的共享变量说明、对该数据结构进行操作的一组过程、对局部于管程内部的共享数据初始化的语句。
2、管程的特征
(1)管程内部的局部数据结构,只能被管程内定义的过程所访问,任何管程之外的过程都不能直接访问它。所有进程要访问临界资源时,都必须经过管程才能进入。
(2)一个进程只有通过调用管程内的过程,才能进入管程访问共享数据。
(3)每次只允许一个进程在管程内执行,其余调用者则需等待,直到该进程释放使用权,管程可用为止,从而通过管程实现了进程的互斥。
管程通常是用于管理资源的,因此管程中有进程等待队列和相应的等待和唤醒操作。一个进程进入管程之前要先申请,离开时需要释放使用权。
利用管程实现同步时,应设置条件变量和在该变量上进行操作的两个相关原语wait和signal。例如,引入条件变量R:
sait(R)操作原语的含义是:进程请求服务未得到满足时,进程被阻塞,被安排到R的等待队列上。
signal(R)操作原语的含义是:先唤醒执行wak(R)被阻塞的进程,如果遇到特殊情况则由调度算法决定哪一个进程执行。
管程的设置可以实现进程同步,协调进程的相互关系。当一个进程通过管程请求访问共享数据而没有得到满足时,则调用wait原语在相关的条件变量上等待,当另一进程访问完共享数据且释放使用权后,这时调用signal原语,唤醒在相关条件变量上等待的首进程。管程的引入可以使进程之间更好地使用共享资源。