概述

  • 最近在开发过程中,遇到一个问题线程优先级翻转的问题。那什么原因导致优先级翻转呢?

  • 在RTOS开发中,优先级翻转问题也是值得我们去关注留意的。避免代码瘫痪。

什么是优先级翻转

  • 所谓的优先级翻转问题:即当一个高优先级线程通过信号量机制访问共享资源时,该型号量以被一个低优先级线程占有,而这个低优先级的任务在访问共享资源时可能又被一个中等优先级任务抢占。从上面的描述,高优先级线程被许多较低优先级的任务阻塞,导致高优先级的实时性得不到保证。

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

如何解决优先级翻转

  • 解决优先级翻转的方法:优先级天花板、优先级继承。那么这两种方法有什么?

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

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

RT-Thread是如何解决线程优先级翻转呢?

  • 在官方的文档中,对线程优先级翻转有相对应的说明及解决方法。下面我把RT-THREAD官方的描述及解决方法贴出来。

  • 使用信号量会导致的另一个潜在问题是线程优先级翻转问题。所谓优先级翻转,即当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被一低优先级线程持有,而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞,实时性难以得到保证。如下图所示:有优先级为 A、B 和 C 的三个线程,优先级 A > B > C。线程 A,B 处于挂起状态,等待某一事件触发,线程 C 正在运行,此时线程 C 开始使用某一共享资源 M。在使用过程中,线程 A 等待的事件到来,线程 A 转为就绪态,因为它比线程 C 优先级高,所以立即执行。但是当线程 A 要使用共享资源 M 时,由于其正在被线程 C 使用,因此线程 A 被挂起切换到线程 C 运行。如果此时线程 B 等待的事件到来,则线程 B 转为就绪态。由于线程 B 的优先级比线程 C 高,因此线程 B 开始运行,直到其运行完毕,线程 C 才开始运行。只有当线程 C 释放共享资源 M 后,线程 A 才得以执行。在这种情况下,优先级发生了翻转:线程 B 先于线程 A 运行。这样便不能保证高优先级线程的响应时间。

  • 在 RT-Thread 操作系统中,互斥量可以解决优先级翻转问题,实现的是优先级继承算法。优先级继承是通过在线程 A 尝试获取共享资源而被挂起的期间内,将线程 C 的优先级提升到线程 A 的优先级别,从而解决优先级翻转引起的问题。这样能够防止 C(间接地防止 A)被 B 抢占,如下图所示。优先级继承是指,提高某个占有某种资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,然后执行,而当这个低优先级线程释放该资源时,优先级重新回到初始设定。因此,继承优先级的线程避免了系统资源被任何中间优先级的线程抢占。

说明

  • 对于我们开发来说,要避免发生优先级翻转的问题。

  • 优先级翻转的危害:

  1. 任务调度时,时间不确定性,破坏实时系统的实时性,严重时可能导致系统崩溃。

  2. 优先级低的任务比优先级高的任务更先执行,导致任务的错乱,逻辑的错乱。

关注微信公众号『Rice嵌入式开发技术分享』,后台回复“微信”添加作者微信,备注”入群“,便可邀请进入技术交流群。

线程优先级翻转,如何避免?相关推荐

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

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

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

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

  3. Java多线程复习:5(sleep、yield方法和线程优先级)

    sleep.yield方法和线程优先级 sleep方法 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞): 其它线程可以使用 interrupt 方法打 ...

  4. [改善Java代码]线程优先级只使用三个等级

    线程的优先级(priority)决定了线程获得CPU运行的机会,优先级越高获得的运行机会越大,优先级越低获得的机会越小.Java的线程有10个级别(准确的说是11个级别,级别为0的线程是JVM,应用程 ...

  5. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括: 1. 线程优先级的介绍 2. 线程优先级的示例 3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/s ...

  6. 【Linux 内核】线程调度示例一 ③ ( 获取线程优先级 | 设置线程调度策略 | 代码示例 )

    文章目录 一.获取线程优先级 1.pthread_attr_setschedparam 和 pthread_attr_getschedparam 函数 2.获取线程优先级代码示例 二.设置线程调度策略 ...

  7. 【Linux 内核】进程优先级与调度策略 ③ ( 设置、获取线程优先级的核心函数 | 修改线程调度策略函数 )

    文章目录 一.设置.获取线程优先级的核心函数 二.修改线程调度策略函数 一.设置.获取线程优先级的核心函数 设置.获取 线程 优先级的 核心 函数 : ① 设置 " 创建线程 " ...

  8. 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )

    文章目录 I 线程创建方法 II 线程执行函数 III 线程标识符 IV 线程属性 V 线程属性 1 ( 分离线程 | 非分离线程 ) VI 线程属性 2 ( 线程调度策略 ) VII 线程属性 3 ...

  9. MFC线程优先级程序图示

    线程优先级等级描述如下: idle      (最低)    THREAD_PRIORITY_IDLE LOWEST  低    THREAD_PRIORITY_LOWEST BELOW   低于标准 ...

  10. (61)分析 KiFindReadyThread 函数 —— 线程优先级

    一.前言 通过之前的学习,我们知道了线程切换有两种触发情况,一种是API主动调用切换,另一种是时钟中断切换,时钟中断方式我们还没学. 当线程切换发生时,要调用 KiFindReadyThread 函数 ...

最新文章

  1. 因为有了这个画图工具集,老师同学都说我画的图有特色(Processon,draw.io,Xmind)
  2. arcgis Manager 登陆时提示Incorrect login Information
  3. MONGODB 数据库文件读取的优化
  4. 你知道出现“乱码”的原因是什么吗?(4)
  5. Java开发高性能网站需要关注的事
  6. 架构师技术文档:Redis+Nginx+Dubbo+Spring+架构师精选视频
  7. filebeat 笔记
  8. 经典面试题:Integer c=100,d=100,c==d 一定是false吗?
  9. c语言中各个符号的意义及作用是什么,C语言特殊符号意义
  10. linux数据向量化指令,不充分SIMD向量化技术研究.PDF
  11. laravel 5.2 异常处理页面
  12. 20170910算法工程师在线笔试之求第n个丑数
  13. Internet Explorer 10 的 User-Agent 字符串
  14. python3爬虫必学Xpath,快速使用lxml.etree
  15. u盘资料误删怎么恢复 怎样找回u盘里误删的文件
  16. Axure 教程 |中级电子商务网站设计
  17. 精确光源 Punctual Light Source
  18. linux 设置 用户 密码,Linux系统怎么设置开机密码?Linux设置开机密码的方法
  19. “超低能,劲搞笑”笑话管理系统 v2.0
  20. 使用yaml文件指定 kata 安全容器配置相关参数

热门文章

  1. Link方式导入java项目
  2. java实现标准化考试系统详解(二)-----数据库、数据表的规划和题库增删改查
  3. 一个SEO菜鸟蜕变的故事
  4. 为什么使用一个谷歌浏览器打开网页至少会有四个进程
  5. linux服务器CPU飙升解决办法_MYSQL
  6. win7电脑如何添加无线网络连接服务器,wn7系统网络连接的时候显示本地连接没有有效的ip配置...
  7. 2017中山大学计算机考研科目,中山大学2017年硕士研究生招生学科专业目录
  8. 充电状态读取辨析charging_enabled与battery_charging_enabled
  9. Xcode8.0 打包ipa注意事项
  10. P3398 仓鼠找 sugar