火星拓荒者(Mars Pathfinder)是一艘在1997年携带探测车登陆火星并建立基地的美国太空船。它包括命名为卡尔萨冈纪念站的登陆者,和一辆重量很轻 (10.6公斤/23磅),命名为旅居者号的轮型机器人火星车。这艘太空船于火星全球探勘者号发射一个月之后的1996年12月4日由德爾它 II发射,并于1997年7月4日于火星上称为欧克西亚沼区的克里斯平原阿瑞斯谷着陆。

火星拓荒者号着陆后﹐开始把数据传送回地球。几天后,信息和图像传送就被一系列的总系统复位所中断。对于软件工程师来说,这个问题是被如何诊断和解决的,仍然是一个引人入胜的故事。

1. 什么是优先级反转?

优先级反转是指一个低优先级的任务持有一个被高优先级任务所需要的共享资源。高优先级任务由于因资源缺乏而处于阻塞状态,一直等到低优先级任务释放资源为止。而低优先级获得的CPU时间少,如果此时有优先级处于两者之间的任务,并且不需要那个共享资源,则该中优先级的任务反而超过这两个任务而获得CPU时间。如果高优先级等待资源时不是阻塞等待,而是忙循环,则可能永远无法获得资源,因为此时低优先级进程无法与高优先级进程争夺CPU时间,从而无法执行,进而无法释放资源,造成的后果就是高优先级任务无法获得资源而继续推进。

简而言之,中优先级的线程一直占据着CPU,导致低优先级线程无法执行,而高优先级线程必须等待低优先级线程执行完释放资源(共享资源)才能执行。

2. 故障发生

故障源自于操作系统中经典的优先级反转问题。

火星探测器有一个信息总线,有一个高优先级的总线管理任务负责总线数据的存取,访问总线都需要通过一个互斥锁;还有一个低优先级的,运行不是很频繁的气象搜集任务,它需要对总线写数据,也就同样需要访问互斥锁;最后还有一个中优先级的通信任务,它的运行时间比较长。

平常,这个系统运行毫无问题,但是有一天,在气象任务获得互斥锁往总线写数据的时候,一个中断发生导致通信任务被调度就绪,通信任务(中优先级)抢占了低优先级的气象任务,而无巧不成书的是,此时高优先级的总线任务正在等待气象任务写完数据归还互斥锁,但是由于通信任务抢占了CPU并且运行时间比较长,导致气象任务得不到CPU时间也无法释放互斥锁,本来是高优先级的总线管理任务也无法执行,总线任务无法及时执行的后果被火星探路者系统认为是一个严重错误,最后就是整个系统被重启。

3. 解决方案

解决优先级反转的一个方法就是优先级捐赠。考虑高,中,和低优先级线程H,M和L. 如果H需要等待L(例如,L正在持有锁),并且M在就绪等待列表中,则H 将永远不会获得CPU,所以在L持有锁的同时,H需要将其优先级“捐赠”给L,L获得了高优先级,这使得L能够抢占M。然后一旦L释放(并因此H获得)锁,便撤回捐赠,回到原来的低优先级。

具体来说,在一个线程获取一个锁的时候, 如果拥有这个锁的线程优先级比自己低就提高它的优先级,然后在这个线程(拥有锁的线程)释放掉这个锁之后把这个锁的线程改回原来的优先级。

Vxworks允许优先级继承,然而遗憾的是,工程师们将这个选项关闭了。

工程师们最终发现了优先级反转。为了解决这个问题,工程师们开启了一个布尔参数,来指示是否应该进行互斥锁定的优先级继承。 上述的互斥锁定已经把该参数关闭;如果打开它,优先级反转就能被阻止,故障就这样被修复完成了。

参考来源:https://www.zhihu.com/question/21460912/answer/18299338

优先级反转的经典案例——火星拓荒者相关推荐

  1. JavaScript 函数(含经典案例:反转数组、求所有参数最大值、判断闰年、获取指定年份的2月份的天数)

    JavaScript 函数 一. 函数的使用 1. 声明函数: 2. 调用函数 二. 函数的参数 1. 形参和实参的定义 2. 形参和实参的使用 3. 函数形参和实参个数不匹配问题 4. 函数的返回值 ...

  2. 让你彻底弄懂Python编程经典案例【考题】之反转一个值

    学习Python有很多不同的方法,可以看视频.看博客.看公众号等.但光说不练,很难有快速的提升.最好能动手去处理实际问题,这样才能把学到的知识应用得更熟练.    本文和你一起来探索Python编程的 ...

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

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

  4. 《Vue入门到精通》最强Vue教程,附带经典案例,万字详解,干货十足!

    目录: 一.前言 二.Vue是什么? 1.简介 2.发展史 3.为什么要学习Vue? 4.jQuery.javascript.Vue的区别 5.Vue框架构造 三.Vue的使用 1.Vue环境搭建 2 ...

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

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

  6. 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】

    RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_se ...

  7. 【Java 多线程】多线程带来的的风险-线程安全、多线程五个经典案例

    日常开发中如果用到多线程编程,也一定会涉及到线程安全问题 线程安全这个问题就不太好理解 正因为如此,程序猿们才尝试发明出更多的编程模型来处理并发编程的任务 例如:多进程.多线程.actor.csp.a ...

  8. C语言88案例,经典案例带你绝对入门C编程!

    链接可以下载完整代码和文档[C语言88案例] C语言经典88案例打包下载地址 链接: www.keketec.club/posts/c065dba1/ 案例ex01: 将字符串转换为一个整数 1 题目 ...

  9. 无领导小组讨论应对技巧及经典案例

    现在已经是大三下学期了,这个时候不得不考虑的事情就是求职问题,而求职不得不面对的就是面试.晚上上就业指导课,老师组织大家模拟进行无领导小组讨论面试,结果当然是问题百出啦.还好只是模拟,还能有时间进行相 ...

最新文章

  1. 甘超波:目标和目的区别
  2. 008 python接口 unittest
  3. python pygame模块按键延迟_pygame模块中键控命令不能实现方块移动,求解
  4. flink RPC(akka)
  5. zabbix简单介绍(1)
  6. quantum_如何从Firefox Quantum删除Pocket
  7. 爬虫案列:京东商城长裤信息获取
  8. ios kvo 要引入_iOS KVO 实现原理 和 自己实现KVO
  9. Java并发编程的艺术 记录(三)
  10. H5页面--Android滑动屏幕图片误触
  11. python可以干嘛-python都可以用来做什么
  12. 凹凸实验室:支撑数千万消费者的小程序开发实践
  13. php随机生成卡密,PHP随机生成不反复的8位卡号(数字)和卡密(字符串)_后端开发...
  14. 吃透空洞卷积(Dilated Convolutions)
  15. 中国工商银行客服经理校招面试
  16. 2021,要这样学大数据开发
  17. 【算法学习笔记六】递归之归纳法
  18. 腾讯云增强型SSD云硬盘性能方面有哪些特点?
  19. 3 机器学习入门——决策树之天气预报、鸢尾花
  20. Linux系统的目录树

热门文章

  1. 基于Java+Swing实现雷电小游戏
  2. Java简单雷电游戏代码
  3. 祝愿大家在新的一年里,万事大吉,送上我设计的可爱暴富小老虎微信红包封面,祝愿大家新的一年财运旺,事业旺,健康旺。
  4. js vue 下载excel(.xls)文件
  5. 我爱赚钱吧:SEO的好处有哪些?
  6. ems苹果专线投递速度_“高功率脉冲磁控溅射”新工艺:苹果 iPhone 12 Pro 金色版图赏 - 苹果,iPhone...
  7. Android——加速传感器(ACCELEROMETER)的应用
  8. 分析ERP审单失败,提示:库存不足的原因及应对方案
  9. 何志强:张尚昀式的当代好青年
  10. python用小海龟画糖葫芦