Huihoo.org - Open Source Middleware Foundation

Last Modified: 2003.05.12

实时系统中的资源共享访问介绍


(by huihoo.org Cocia Lin(cocia@163.com))

实时系统中,如果任务调度采用基于优先级的方式,则传统的资源共享访问机制在系统运行时很容易造成优先级翻转问题,即当一个高优先级任务访问共享资源时,该资源已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些优先级的任务抢先,因此造成高优先级任务被许多具有较低优先级的任务阻塞,高优先级任务在低优先级任务之后运行,实时性得不到保证。因此在实时系统中,对传统的资源访问机制进行扩展,引入了如优先级继承协议(Priority Inheritance Protocol)、优先级限高协议(Priority Ceiling Protocol)等机制,来解决了优先级翻转的问题。

系统能够借助这些协议来改进资源共享访问的合理性,他的前提是,优先级是可以改变的,而且是可以动态改变的。而设计这些协议的本质就是关入管理好优先级改变最优化的方法和理论。

下面简单介绍一下优先级继承协议(Priority Inheritance Protocol)和优先级限高协议(Priority Ceiling Protocol)的基本原理,以至更好的理解实时系统中的资源共享访问机制。

下面先来看看固定优先级的系统,也就是非实时系统中的资源访问的情况。



在这幅图中,我们可以看到,A的优先级比B的优先级高,但是,B笨鸟先飞,先得到资源后,锁定了这个资源开始使用;A迟了一步,而这个访问资源的小门一次只能容许一个任务通过,现在B在其中,所以A只好等待,睡大觉,即使A拥有更大的权力,也没有办法。等到B使用完资源,把它释放出来,这时A才能拿到这个资源,才能继续他的工作。这其中的一个典型问题是,高优先级必须等待低优先级任务完成之后才能进行,从表现上来说,高优先级在这段时间内完成的任务量,和低优先级的任务相当,或者更少。这样,在外部看来,A的优先级可能比B的优先级还低。这种现象就叫做优先级翻转。

实时系统中需要尽量避免这种现象的发生,于是就需要设计避免优先级翻转协议,这个协议的两个实例就是前面提到的优先级继承协议和优先级限高协议。

先来看看优先级继承协议。优先级继承机制的解决方法是,在上图中,低优先级占用资源,而高优先级也要访问此资源的时候,让低优先级任务提高任务优先级,提高到和高优先级同样的级别。这样原来的低优先级任务就可能获得更多的资源(例如,cpu时间,内存等),来尽快的完成任务。以便尽快的释放占用的资源。低优先级任务在运行过程中,从高优先级任务那里继承了任务优先级别,此方法因此得名"优先级继承协议"。

再来看看优先级限高协议。其实这个协议和优先级继承协议很类似,不同的地方在于,低优先级任务这次不是获得高优先级相同的优先级,而是获得某个预先设置好的优先级。而这个预先设置好优先级肯定不会比当前所有的存在的优先级低。在实现中,这个优先级一般被设置为实时系统中最高可能的优先级。这种动态改变优先级的方法就是"优先级限高协议"。

在进行实时系统的应用开发过程中,一般不会涉及到需要开发人员亲手来实现这样的协议的情况。因为在开发的时候,应用一般需要建立在某种平台之上,例如,RTOS,RTSJ,或者RT-CORBA等等。在这些平台之中,已经实现了这其中的某一种协议。多数平台默认提供优先级继承协议。开发人员只要使用平台中的资源访问方法,就可以得到这些协议带来的好处。当然,如果开发人员开发的系统就是这样的平台系统,那就需要涉及到这些协议的实现的细节了。

在了解了实时系统中资源共享访问的解决方法后,相信读者会对实时系统有了进一步的理解。

参考

Huihoo Power!

企业计算研究中心
http://www.huihoo.com

开放企业基金会
http://www.huihoo.org

Real-Time Java Expert Group
http://www.rtj.org