在信号量机制中,每个要访问临界资源的进程都必须自备同步的PV操作,大量分散的同步操作给系统管理带来了麻烦,且容易因同步操作不当而导致系统死锁。于是,产生了一中新的进程同步工具——管程。管程的特性保证了进程互斥,无需程序员自己实现互斥,从而降低了死锁发生的可能性。同时管程提供了条件变量,可以让程序员灵活地实现进程同步
管程的定义
系统中的各种硬件资源和软件资源,均可用数据结构抽象地描述其资源特性,即用少量信息和对资源所执行的操作来表征该资源,而忽略它们的内部结构和实现细节
利用共享数据结构抽象地表示系统中的共享资源,而把对该数据结构实施的操作定义为一组过程。进程对共享资源的申请、释放等操作,都通过这组过程来实现,这组过程还可以根据资源情况,或接受或阻塞进程的访问,确保每次仅有一个进程使用共享资源,这样就可以统一管理对共享资源的所有访问,实现进程互斥。这个代表共享资源的数据结构以及由对该共享数据结构实施的一组过程所组成的资源管理程序,称为管程。管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据。
由上述定义可知,管程由4部分组成
1:管程的名称
2:局部于管程内部的共享数据结构说明
3:对该数据结构进程操作的一组过程(或函数)
4:对局部于管程内部的共享数据设置初始值的语句
管程把对共享资源的操作封装起来,管程内的共享数据结构只能被管程内的过程所访问。一个进程只有通过管程内的过程才能进入管程访问共享资源。
每次仅允许一个进程进入管程,从而实现进程互斥。若多个进程同时调用申请资源操作,归还资源操作,则只有某个基础讷航运行完它调用的过程后,下个进程才能开始运行它调用的过程。也就是说,各个进程只能串行执行管程内的过程,这一特性保证了进程“互斥”访问共享数据结构S
条件变量
当一个进程进入管程后被阻塞,知道阻塞的原因解除时,在此期间,如果该进程不释放管程,那么其他进程无法进入管程。为此,将阻塞原因定义为条件变量condition。通常,一个进程被阻塞的原因可以有多个,因此在管程中设置了多个条件变量。每个条件变量保存了一个等待队列。用于记录因该条件变量而阻塞的所有进程,对条件变量只能进程两种操作,即wait和signal
1:x.wait:当x队列的条件不满足时,正在调用管程的进程调用x.wait将自
己插入x条件的等待队列,并释放管程。此时其他进程可以使用该管程
2:x.signal :x对应的条件发生了变化,则调用x.signal,唤醒一个因x
条件而阻塞的进程
条件变量和信号量的比较:
相同点:条件变量的wait/signal 操作类似于信号量的PV操作,可以实现进程的阻塞/唤醒文章来源:https://www.toymoban.com/news/detail-658570.html
不同点:条件变量是“没有值”的,仅实现了“排队等待”功能;而信号量是“有值”的,信号量的值反映了剩余资源数,而在管程中,剩余资源数用共享数据结构记录文章来源地址https://www.toymoban.com/news/detail-658570.html
到了这里,关于管程的定义和条件变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!