什么是优先级反转

优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即:

高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。-- 从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。

具体来说:当高优先级任务正等待信号量(此信号量被一个低优先级任务拥有着)的时候,一个介于两个任务优先之间的中等优先级任务开始执行——这就会导致一个高优先级任务在等待一个低优先级任务,而低优先级任务却无法执行类似死锁的情形发生。

一个具体的例子:假定一个进程中有三个线程Thread1(高)、Thread2(中)和Thread3(低),考虑下图的执行情况。

优先级反转实例图示
  • T0时刻,Thread3运行,并获得同步资源SYNCH1;
  • T1时刻,Thread2开始运行,由于优先级高于Thread3,Thread3被抢占(未释放同步资源SYNCH1),Thread2被调度执行;
  • T2时刻,Thread1抢占Thread2;
  • T3时刻,Thread1需要同步资源SYNCH1,但SYNCH1被更低优先级的Thread3所拥有,Thread1被挂起等待该资源
  • 而此时线程Thread2和Thread3都处于可运行状态,Thread2的优先级大于Thread3的优先级,Thread2被调度执行。最终的结果是高优先级的Thread1迟迟无法得到调度,而中优先级的Thread2却能抢到CPU资源。

上述现象中,优先级最高的Thread1要得到调度,不仅需要等Thread3释放同步资源(这个很正常),而且还需要等待另外一个毫不相关的中优先级线程Thread2执行完成(这个就不合理了),会导致调度的实时性就很差了。

解决方法1:优先级继承

优先级继承就是为了解决优先级反转问题而提出的一种优化机制。其大致原理是让低优先级线程在获得同步资源的时候(如果有高优先级的线程也需要使用该同步资源时),临时提升其优先级。以前其能更快的执行并释放同步资源。释放同步资源后再恢复其原来的优先级。

带有优先级继承调度过程

与上图相比,到了T3时刻,Thread1需要Thread3占用的同步资源SYNCH1,操作系统检测到这种情况后,就把 Thread3的优先级提高到Thread1的优先级。此时处于可运行状态的线程Thread2和Thread3中,Thread3的优先级大于Thread2的优先级,Thread3被调度执行。

Thread3执行到T4时刻,释放了同步资源SYNCH1,操作系统恢复了Thread3的优先级,Thread1获得了同步资源SYNCH1,重新进入可执行队列。处于可运行状态的线程Thread1和Thread2中,Thread1的优先级大于Thread2的优先级,所以Thread1被调度执行。

通过优先级继承机制,可以有效解决优先级反转问题,使优先级最高的Thread1获得执行的时机提前。

解决方法2:优先级天花板

优先级天花板是当线程申请某共享资源时,把该线程的优先级提升到可访问这个资源的所有线程中的最高优先级,这个优先级称为该资源的优先级天花板。

这种方法简单易行,不必进行复杂的判断,不管线程是否阻塞了高优先级线程的运行,只要线程访问共享资源都会提升线程的优先级。

什么是优先级反转及解决方法相关推荐

  1. 优先级反转和解决方法

    优先级反转的描述: 假设任务1,任务2,任务3:他们的优先级顺序分别为1 > 2 > 3.有一个稀缺资源S,S由一个信号量控制为互斥访问. 任务3正在执行,并申请到了资源S: 任务1抢占了 ...

  2. 实时操作系统和优先级反转

    实时操作系统(Real-time operating system, RTOS)是说,任务切换和中断响应的时间必须保证在多少时间内(如5us内)完成. 分为硬实时和软实操作系统: 硬实时是说必须在多少 ...

  3. 优先级反转和优先级继承

    iOS的锁中有一个自选锁OSSpinLock , 这个api被标记为不推荐 , 理由就是会产生优先级反转的问题, 当时并不是特别理解这个优先级反转 . 后来在看一本书 <算法之美> 里在讲 ...

  4. 优先级反转的经典案例——火星拓荒者

    火星拓荒者(Mars Pathfinder)是一艘在1997年携带探测车登陆火星并建立基地的美国太空船.它包括命名为卡尔萨冈纪念站的登陆者,和一辆重量很轻 (10.6公斤/23磅),命名为旅居者号的轮 ...

  5. Java 线程实例一(查看线程是否存活、获取当前线程名称、状态监测、线程优先级设置、死锁及解决方法、获取线程id、线程挂起)

    查看线程是否存活 以下实例演示了如何通过继承 Thread 类并使用 isAlive() 方法来检测一个线程是否存活: public class TwoThreadAlive extends Thre ...

  6. 操作系统:优先级反转

    (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优先级依次是A>B>C ...

  7. 多线程的那点儿事(之优先级反转)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 优先级反转对于编写应用层的人员来说不大会发生,但是对于操作系统的设计者来说确是一个逃不过去的问 ...

  8. 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转

    本次笔记内容: 8.1 背景 8.2 调度原则 8.3 调度算法1 8.4 调度算法2 8.5 实时调度 8.6 多处理调度与优先级反转 文章目录 CPU调度背景 上下文切换 CPU调度 在进程/线程 ...

  9. 信号量优先级反转问题记录(总是遗忘)

    1.信号量 信号量一般用于线程间同步,多个线程获取一个共享资源时,该资源信号量的count值不小于0时,取得count的线程皆可访问共享资源(类似于流量QOS中的令牌桶\通行证).当count值小于0 ...

最新文章

  1. NDK 提示undefined reference to xxx“的解决办法
  2. HTML4.0标准语法--表格
  3. centos7中nfs文件系统的使用
  4. zabbix监控系统的安装与配置
  5. makefile中变量有哪些?
  6. ie浏览器修复_腾讯安全:IE浏览器曝远程执行代码漏洞 腾讯安全强势推出漏洞修复工具...
  7. WSGI接口(廖雪峰重点)
  8. xshell连接虚拟机里的linux系统
  9. FMI在仿真软件SkyEye中的应用
  10. 创建表空间、用户和赋权
  11. wpf开发仿真3d软件_3D体验平台品牌应用——SOLIDWORKS?
  12. T-SQL 视图 事物 备份还原 分离附加
  13. 定损是保险公司定还是4s店定的?
  14. python 宏定义_「Rust笔记」Rust之自定义宏写法
  15. Android抓包工具Fiddler的使用教程
  16. 常用视频播放器插件汇总
  17. 服务器主板的无线驱动,驱动天空 - 品牌主板 - 服务器主板 SERVER
  18. 在北京税前工资2万元,扣掉社保五险和一金税后能拿多少钱?
  19. 收到了CSDN送的图书,表示感谢|对《程序员的三门课》的一表格表示疑问
  20. ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事

热门文章

  1. Mac 下彻底卸载Unity3d
  2. ABAQUS|多重约束的解决办法!(过约束/螺栓预紧力)
  3. 二阶常系数偏微分线性变量代换化简
  4. 怎样进行电路的抗干扰设计
  5. 谈一谈APP支付失败的处理
  6. 关于系统升级将暂停人爱官网、人爱数字化平台、人爱软件平台的通知
  7. ActiveMQ消息持久化_队列_7
  8. css 画一条水平直线和垂直竖线
  9. 梦想照进现实|CSDN 实体奖牌 第二期
  10. C# 生成带二维表头的Excel表