Chinaunix首页 | 论坛 | 博客
  • 博客访问: 403116
  • 博文数量: 96
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 415
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-22 09:08
个人简介

最近的研究方向:Nginx

文章分类
文章存档

2017年(2)

2016年(59)

2015年(35)

我的朋友

分类: LINUX

2015-10-13 17:36:11

所谓优先级反转问题(priority inversion)即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级任务抢先,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证

例如:

现在有3个任务,A、B、C。他们的优先级为A>B>C。假设,最开始C任务开始运行,A,B都没有就绪。C访问了某共享资源s,该共享资源并没有释放时,任务A的执行条件满足了。由于优先级高,所以任务A开始执行,当任务A执行时要调用共享资源s时,又因为此资源被任务C使用了,还没有释放,所以任务A就被挂起,任务C开始执行。这时任务B的执行条件满足了,由于优先级比任务C高,所以任务B先执行,等任务B执行完后,任务C再执行,等到任务C释放了共享资源s后,任务A才开始转为就绪态继续执行,直到结束。

在这种情况下,任务A的优先级高于任务B,但是任务B却比任务A先执行,优先级发生了翻转。

解决方法

 1.优先级天花板。当任务C使用资源S时,就把任务C的优先级提升到能访问资源S的最高优先级,执行完成释放资源之后,把优先级再改回来;这样的方法,简单易行,解决了多个高优先级任务抢占资源S的问题。但是带来了一些缺点,就是不一定每次都有高优先级任务抢占资源S,每次都提升优先级是对CPU资源的一种浪费。

2.优先级继承。当任务C使用资源S时,任务A抢占执行权,申请资源S,比较资源A和资源C的优先级,假如任务A优先级高,才提升任务C,提升到和任务A相同的优先级,当任务C释放资源后,将优先级再调整回来。相对于优先级天花板方法,相当于延后执行,克服了任务A的缺点,自己本身的特点是,逻辑复杂,需要操作系统支持相同优先级。

    3.两者结合的方案:当任务C使用资源S时,任务A抢占执行权,申请资源S,比较资源A和资源C的优先级,假如任务A优先级高,才提升任务C,提升到能访问资源S的最高优先级,当任务C释放资源后,将优先级再调整回来。

阅读(1915) | 评论(0) | 转发(0) |
0

上一篇:C语言中的static

下一篇:GCC参数详解

给主人留下些什么吧!~~