虽然信号量机制是一种既方便、又有效的进程同步机制,但每个要访问临界资源的进程都必须自备同步操作wait(S) 和signal(S)。这就使大量的同步操作分散在各个进程中。这不仅给系统的管理带来了麻烦,而且还会因同步操作的使用不当而导致系统死锁。这样,在解决上述问题的过程中,便产生了一种新的进程同步工具——管程(Monitors)。
1.管程的定义
系统中的各种硬件资源和软件资源均可用数据结构抽象地描述其资源特性,即用少量信息和对该资源所执行的操作来表征该资源,而忽略它们的内部结构和实现细节。一个管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
由上述的定义可知,管程由四部分组成:
①管程的名称;
②局部于管程的共享数据结构说明;
③对该数据结构进行操作的一组过程;
④对局部于管程的共享数据设置初始值的语句。
封装于管程内部的数据结构仅能被封装于管程内部的过程所访问,任何管程外的过程都不能访问它;反之,封装于管程内部的过程也仅能访问管程内的数据结构。
①模块化,即管程是一个基本程序单位,可以单独编译;
②抽象数据类型,指管程中不仅有数据,而且有对数据的操作;
③信息掩蔽,指管程中的数据结构只能被管程中的过程访问,这些过程也是在管程内部定义,供管程外的进程调用,而管程中的数据结构以及过程(函数)的具体实现外部不可见。
①虽然二者都定义了数据结构,但进程定义的是私有数据结构PCB,管程定义的是公共数据结构;
②二者都存在对各自数据结构上的操作,但进程是由顺序程序执行有关操作,而管程主要是进行同步操作和初始化操作;
③设置进程的目的在于实现系统的并发性,而管程的设置则是解决共享资源的互斥使用问题;
④进程通过调用管程中的过程对共享数据结构实行操作,该过程就如通常的子程序一样被调用,因而管程为被动工作方式,进程则为主动工作方式。
⑤进程之间能并发执行,而管程则不能与其调用者并发;
⑥进程具有动态性,由“创建”而诞生,由“撤销”而消亡,而管程则是操作系统中的一个资源管理模块,供进程调用。
2.条件变量
一个进程进入管程后被阻塞,直到阻塞的原因解除时,在此期间,如果该进程不释放管程,那么其他进程无法进入管程。为此,将阻塞原因定义为条件变量condition。在利用管程实现进程同步时,必须设置同步工具,如两个同步操作原语 wait 和 signal。当某进程通过管程请求获得临界资源而未能满足时,管程便调用 wait 原语使该进程等待,并将其排在等待队列上。仅当另一进程访问完成并释放该资源之后,管程才又调用 signal 原语,唤醒等待队列中的队首进程。
x.wait:当x 对应的条件不满足时,正在调用管程的进程调用x.wait将自己插入x 条件的等待队列,并释放管程。此时其他进程可以使用该管程。
x.signal:x 对应的条件发生了变化,则调用x.signal,唤醒一个因x 条件而阻塞的进程。
相似点:条件变量的wait/signal操作类似于信号量的P/V操作,可以实现进程的阻塞/唤醒。
不同点:...
无
登录后开始许愿
暂无评论,来抢沙发