优先级反转,是操作系统调度进程时出现的一种错误。是指在使用资源的时候时,可能会出现的这样一种不合理的现象,即:

高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到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执行完成(这个就不合理了),会导致调度的实时性就很差了。

什么是优先级继承

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

带有优先级继承调度过程

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

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

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

操作系统 多线程之优先级翻转相关推荐

  1. 优先级翻转与优先级继承

    优先级翻转与优先级继承 田海立 2006-3-7 摘要 本文描述操作系统中的优先级翻转(Priority Inversion,也有翻译为反转,逆转或倒置的)现象以及如何用优先级继承来解决此类问题的方法 ...

  2. 操作系统多线程实现_操作系统中的线程实现

    操作系统多线程实现 Each process has an address space. There is one thread of control in every traditional OS. ...

  3. FreeRTOS——优先级翻转

    一.优先级翻转 在使用二值信号量的时候会遇到很常见的一个问题--优先级翻转,优先级翻转在可剥夺内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果. 高优 ...

  4. rtthread学习-防止优先级翻转

    学习视频网址: RT-Thread内核入门指南-线程的优先级翻转问题 学习记录. 第一次学这门课的时候,是觉得有点迷糊 课上讲了ABC三个优先级的线程,A是需要使用C中的互斥量,而互斥量在C中锁住了, ...

  5. 再解析下内核自旋锁和优先级翻转问题

    [内核同步]自旋锁spin_lock.spin_lock_irq 和 spin_lock_irqsave 分析 漫画|Linux 并发.竞态.互斥锁.自旋锁.信号量都是什么鬼? Linux内核自旋锁 ...

  6. Java多线程之优先级setPriority

    在操作系统中,线程可以划分优先级,优先级较高的线程得到CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务(其实并不是这样). 在Java中,线程的优先级用setPriority()方法就 ...

  7. linux多进程优先级,Linux多线程之优先级

    1.多线程的作用: 即什么情况考虑使用多线程? 2.多线程的创建: 默认参数创建即可!pthread_create(&tid,NULL,(void *)thread_func,NULL); 3 ...

  8. Linux操作系统多线程信号总结(转)

    linux 多线程信号编程总结 linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函 ...

  9. 操作系统--多线程进阶(上)

    目录 前言 一丶常见的锁策略 <1>乐观锁和悲观锁思想 1>乐观锁 2>悲观锁 <2>重量级锁和轻量级锁 1>重量级锁 关于用户态切换到内核态的方式 2> ...

最新文章

  1. 方法的运用_企业如何运用论坛做营销,千享科技分享技巧方法
  2. 查看oracle已经锁定的表,Oracle中查询被锁定的表
  3. h1.1 hadoop简介
  4. 「BZOJ3226」[Sdoi2008]校门外的区间
  5. 输变电设备物联网节点设备无线组网协议_SmartModule物联网智能测控组件
  6. 大工19春《计算机原理》在线作业2,大工19春《计算机原理》在线作业2.pdf
  7. ICCV 2021 | CMU朱俊彦团队:用一张草图轻松创建GAN模型
  8. boost::units模块实现测试显式和隐式单位转换
  9. Dubbo(三)之Spring zookeeper集成
  10. python sql语句生成_python Django 生成sql语句
  11. 一种单独适配于NER的数据增强方法:DAGA
  12. 小程序modal控件(显示为弹框) 可有输入框
  13. mfc中点击关闭按钮时删除指定文件
  14. PHP正则表达式的运用
  15. ios 简单的计时器游戏 NSUserDefaults NSDate NSTimer
  16. 杭电1874————单源最短路径(dijkstra)
  17. Python 初始篇
  18. iOS_SN_深浅拷贝( 百度的)_转载
  19. mysql的配置文件名称是_【MySQL学生手册】MySQL的配置文件
  20. bat计算机清理原理,电脑如何一键清除垃圾bat

热门文章

  1. python工资这么高为什么不学-现在Python就业薪资高吗?
  2. 零基础学python实战-Python3零基础入门到爬虫实战
  3. python全套完整教程-Python语言基础50课 全套完整版(含doc版)
  4. python基础教程是什么-python基础教程都有什么?
  5. micropython和python区别-MicroPython与Python速度对比
  6. python和java哪个好学-Python和Java发展前景哪个好?老男孩python高级编程
  7. python简单程序实例-Python简单基础小程序的实例代码
  8. 零基础学python知乎-零基础应该选择学习 java、php、前端 还是 python?
  9. python经典实例-Python机器学习经典实例
  10. 基于ARM的非特定人语音识别系统设计