一、什么是优先级翻转问题

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

  例如:有优先级为A、B和C三个任务,优先级A>B>C,任务A,B处于挂起状态,等待某一事件发生,任务C正在运行,此时任务C开始使用某一共享资源S。在使用中,任务A等待事件到来,任务A转为就绪态,因为它比任务C优先级高,所以立即执行。当任务A要使用共享资源S时,由于其正在被任务C使用,因此任务A被挂起,任务C开始运行。如果此时任务B等待事件到来,则任务B转为就绪态。由于任务B优先级比任务C高,因此任务B开始运行,直到其运行完毕,任务C才开始运行。直到任务C释放共享资源S后,任务A才得以执行。在这种情况下,优先级发生了翻转,任务B先于任务A运行。

二、解决办法

  解决优先级翻转问题有优先级天花板和优先级继承两种办法。

1.1 优先级天花板(Priority Ceiling)

  优先级天花板是当任务申请某资源时, 把该任务的优先级提升到可访问这个资源的所有任务中的最高优先级, 这个优先级称为该资源的优先级天花板。这种方法简单易行, 不必进行复杂的判断, 不管任务是否阻塞了高优先级任务的运行, 只要任务访问共享资源都会提升任务的优先级。

1.2 优先级继承(Priority Inheritance)

  优先级继承是当任务A 申请共享资源S 时, 如果S正在被任务C 使用,通过比较任务C 与自身的优先级,如发现任务C 的优先级小于自身的优先级, 则将任务C的优先级提升到自身的优先级, 任务C 释放资源S 后,再恢复任务C 的原优先级。这种方法只在占有资源的低优先级任务阻塞了高优先级任务时才动态的改变任务的优先级,如果过程较复杂, 则需要进行判断。

三、对程序员的启发

  一般来说,优先级反转对于编写应用层的人员来说不大会发生,但是对于操作系统的设计者来说确是一个逃不过去的问题。

  作为应用程序开发人员,也应该尽量避免发生优先级翻转的问题。因此需要注意以下几点:

  1. 优先级反转提醒我们使用锁的代码段应尽量短;
  2. 注意用小锁代替大锁,减少冲突的机会;
  3. 如果锁保护的代码段很短,直接使用原子锁忙等也是不错的一个方法。

小结:

  本文主要写了操作系统调度过程中可能发生多线程优先级翻转的问题,针对此问题,应用程序开发者也应该注意做一些优化。

转载于:https://www.cnblogs.com/kuliuheng/p/4080997.html

多线程编程之优先级翻转问题相关推荐

  1. 20180829-Java多线程编程

    Java 多线程编程 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分. 程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特 ...

  2. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process ...

  3. .NET多线程编程入门

    在.NET多线程编程这个系列我们讲一起来探讨多线程编程的各个方面.首先我将在本篇文章的开始向大家介绍多线程的有关概念以及多线程编程的基础知识;在接下来的文章中,我将逐一讲述.NET平台上多线程编程的知 ...

  4. Linux 多线程编程

    这篇文章总结下 Linux 中多线程编程中能用到的几个函数,当然,需要同步操作的时候还需要加锁的操作,这里,没有列举的这么具体,只是把最常用的函数介绍下. 在编写多线程程序在编译的时候需要加上 -lp ...

  5. Android 开发中的多线程编程技术

    此文章来自"Intel Software"应用开发 多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗? ...

  6. 多线程编程java_Java多线程编程

    Java给多线程编程提供了内置的支持.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销. ...

  7. java超线程_超线程多核心下Java多线程编程技术分析

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...

  8. C#多线程编程介绍——使用thread、threadpool、timer

    C#多线程编程介绍--使用thread.threadpool.timer 在system.threading 命名空间提供一些使得能进行多线程编程的类和接口,其中线程的创建有以下三种方法:thread ...

  9. 【linux】多线程编程(c语言编程)

    多线程编程 一.线程的基本概念         与进程相比,多线程是一种非常"节俭"的多任务操作方式.在linux操作系统下,启动一个新进程必须给     它分配独立的地址空间,建 ...

  10. Java多线程编程总结

    ava多线程编程总结 下面是Java线程系列博文的一个编目: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换  Java线程:线 ...

最新文章

  1. ubuntu10.04 安装virtualbox
  2. How mBDOC is generated and saved in DB
  3. tensorflow量化感知训练_tensorflow模型量化实例
  4. 最新的.NET Framework聚焦于改进可访问性
  5. mysql数据库更改文档_更改MySQL数据库目录位置
  6. 学员感言html效果图,学员感言丨非计算机专业学员 开始学HTML5的点点滴滴
  7. MySQL 自定义函数设置执行时间_mysql自定义函数计算时间段内的工作日(支持跨年)...
  8. clear linux安装教程,Clear Linux OS特性介绍,附下载地址
  9. html表格制作应该注意什么软件,html表格制作
  10. Using TFS2010 Build 提示:Silverlight 4 SDK is not installed解决方法
  11. 制作U盘启动时的写入模式HDD-FAT32、ZIP-FAT32、HDD-FAT16、ZIP-FAT16有什么区别?
  12. 为什么html中使用不了样式,css不起作用是什么原因?
  13. 数码管段码代码查询工具
  14. 2022年「博客之星」参赛博主:一个处女座的测试
  15. vscode 修改缩进格数
  16. css实现圆形进度条加载动画
  17. 银行管理系统 Java语句
  18. 利用cad等高线生成dem的步骤
  19. 启用计算机的无线同屏,完美:将计算机转换为无线显示器,Windows 10的此功能确实强大...
  20. 网络安全学习记录-9

热门文章

  1. Springboot配置devtools实现热部署
  2. HDU1317 —— 最长路+判断正环
  3. android加载图片+背景,Android开发中ImageLoder加载网络图片时将图片设置为ImageView背景的方法...
  4. oracle去重复值查询,Oracle 重复数据查询以及删除
  5. Java多线程讲解,超详细!可获取相关笔记
  6. Hibernate逍遥游记-第5章映射一对多-02双向(set、key、one-to-many、inverse、cascade=all-delete-orphan)...
  7. SDL2源码分析1:初始化(SDL_Init())
  8. Mac 应用开发--Cocoa运用程序显示或隐藏MainNemu
  9. 【备用】SQL SERVER存储过程执行速度慢的问题
  10. greenDaoMaster的学习研究