实时系统中的优先级翻转问题

来源:互联网 发布:蔻臣士怎么样知乎 编辑:程序博客网 时间:2024/05/22 16:05

由于共享访问临界资源的问题,实时系统的优先级会出现翻转,导致低优先级的某个进程会比高优先级的某个进程优先执行。


这是个问题,严重可能导致关键进程迟迟不能执行,系统崩溃。

有2个方法可以解决这个问题,那就是“升级”。

1,优先级继承;

2,优先级天花板.


情景:

任务t1,t2,t3的优先级分别是p1,p2,p3; p1>p2>p3; t3占用打印机正在打印文档,中断到来,任务调度,t1就绪,t1开始运行,t1运行一会,发现自己也需要打印文档,但是打印机被占用了,只好等待(阻塞),os重新开始调度,发现t2就绪,t2比t3的优先级高,t2开始执行,t2执行完毕,或者因为等待另外的资源的,os开始重新调度,执行t3,t3打印完毕,释放了打印机,os重新调度,t1就绪,开始执行,t1打印完毕,结束,os重新调度,t3开始执行。


例子中,由于t1等待t3的资源,而让t2这个家伙抢了先执行,优先级翻转了!


归纳一下:高优先级的任务等待一个被低优先级任务霸占的资源而阻塞,而霸占这个资源的低优先级任务又很容易被其他中等优先级的任务抢占进而阻塞,导致高优先级任务迟迟得不到运行。


=========

解决办法:

=========

1,优先级继承

当t1需要访问t3的已经霸占的打印机的时候,会被阻塞,在阻塞t1的时候,顺便把t3的优先级提高到t1的优先级p1,这样任何比t1的优先级低的任务,比如说t2,就甭想抢占t3的cpu来执行。当t3释放打印机的时候,如果之前有过优先级提高,就把t3的优先级打回原形p3。 

也就是说,t1 如果“碰”到了t3的资源的,t3的优先级被提高到t1的优先级,t3释放资源的时候,恢复到自己本来的优先级。



2,优先级天花板

在优先权极限方案中,系统把每一个临界资源与一个极限优先权相联系。

这个极限优先权等于系统此时最高优先权加1。

当1个任务进入临界区时,系统便把这个极限优先权传递给这个任务,使得这个任务的优先权最高;

当这个任务退出临界区后,系统立即把它的优先权恢复正常,从而保证系统不会出现优先权反转的情况。

如上例中,当t3进入临界区时,立即(而不是等到t1来“触碰”的时候)把它的优先权升高到极限优先权,

这个时候t3可“安心的”使用资源直到释放,

但是t3此时也应该 "自觉地" 能尽快退出临界区,进而释放其占有的信号量。

当高优先级任务 t1执行的时候就不会出现其等待低优先级任务t3释放信号量而被阻塞的情况,

从而保证不会出现上面所说的优先级反转。

优先级天花板的本质是让占有资源的任务尽快执行完,并释放资源,从而使与其竞争资源的高优先级任务尽快地得到执行,并通过良好定义的调度规则使任务不会交错占有资源而形成环路等待,从而保证死锁不会发生。(http://www.laogu.com/wz_10162.htm)



参考:

http://www.upsdn.net/html/2005-04/458.html




原创粉丝点击