拓荒者号飞行器在1997年7月4日登陆火星,并开始收集星球上的数据,并将数据传送回地球。但是在任务开始几天后,飞行器就开始经历重置整个系统的bug。这导致了大量珍贵的采集数据的丢失。在经历了制作团队(Jet Propulsion Laboratory)巨大的努力排查之后,发现问题的根源在于系统调度中的优先级翻转问题。

对于任何一个设置优先级的操作系统,系统都会先执行优先级最高的任务。优先级翻转是指当系统由于某些原因不得不等待低优先级的任务完成,才让高优先级任务执行的情况。这种看似不合理的情况是非常容易发生的。比如说,为了保证系统运行结果的正确性,公共变量不得不在被使用时先“锁”起来。当程序A在执行过程中,如果占用了某个公共变量X,任何其他的程序,比如B都不可以访问这个变量X。B能做的只有等待A在使用完这个变量,并且释放了对这个变量的控制权之后,才可以去访问这个公共变量X。通常实现这个的方法是设置semaphore。当B的优先级比A高的时候,优先级翻转的问题就随之产生了。

优先级翻转还会带来一个问题,就是在高优先级任务等待低优先级任务完成的时候,可能这个高优先级任务本身就会错过完成的截止日期,这反过来又会影响到其他的程序,翻来覆去就会对整个系统就会造成致命的影响。

回到拓荒者飞行器的故事上,简单来说它的操作系统总共设置了3个任务,优先级依次下降:

T1:周期性的检测飞行器系统和软件是否工作正常
T2:处理图像数据
T3:随机对某些设备的状态进行检测

当任务T1完成后,系统中的看门狗时钟就会被重置到最大值。如果看门狗的数值降低到负值,也就是说当T1没有按时完成时,系统就会认为整个操作系统一定是在某个地方出现了比较严重的问题,安全起见,操作系统就会重置所有的软件以及硬件。这个操作会花费大量的时间。同时系统设定,T1和T3共同拥有一个公共数据结构(即变量)。

下图描述了优先级翻转发生的过程:

t1时刻:T3开始执行

t2时刻:T3锁住了semaphore,也就是s,导致其他程序无法访问公共变量s

t3时刻:T1由于拥有更高的优先级,替代了T3,并让自己开始执行

t4时刻:T1想要访问公共变量s,但是由于T3已经锁住了公共变量s,所以T1无法访问公共变量s,只好暂停程序

t5时刻:T2由于拥有比T3更高的优先级,于是开始执行

t6时刻:T2由于一些其他的因素暂停执行,这些因素于T1和T_无关,所以T2可能执行了很长时间

t7时刻:T3终于获得机会执行,在使用完公共变量s并将其释放后,T1立刻抢占了资源,开始执行

由上述过程可以发现,T1必须等待T2和T3都执行完之后才可以执行完自己的程序。这么做的后果是很有可能T1无法按时完成,导致系统重启。

一个比较好的解决方案就是,引入优先级继承的机制,即,在T3锁住公共变量后,它遍继承了和它共享这个公共变量的T1的优先级,如下图所示,这样就可以很大程度上避免上述问题。具体的步骤如下所示:

t1时刻:T3开始执行

t2时刻:T3锁住了semaphore,也就是s,导致其他程序无法访问公共变量s

t3时刻:T1由于拥有更高的优先级,替代了T3,并让自己开始执行

t4时刻:T1想要访问公共变量s,但是由于T3已经锁住了公共变量s,所以T1无法访问公共变量s,只好暂停程序,但同时,T1将自己的优先级赋予了T3

t5时刻:T2想要执行,但是此时其优先级小于T3,所以暂不执行

t6时刻:T3执行完对于公共区域内的一系列程序,向T1返还优先级。这时T1抢占了T3的资源开始执行

t7时刻:T1执行完毕,换T2执行

转载于:https://www.cnblogs.com/flowerdrops/p/8717872.html

通过1997年拓荒者号飞行器事件理解优先级反转相关推荐

  1. 【BLE MIDI】MIDI 时间标志分析 ( 音符速度设置事件 | 拍号设置事件 | 基本时间 - 每个四分音符有多少 tick 或 pulse | 节拍时值计算 | 小节时值计算 )

    文章目录 一.从 MIDI 文件中可以获取的信息 1.音符速度设置事件 2.拍号设置事件 3.文件头基本时间 二.节拍时值计算 三.小节时值计算 一.从 MIDI 文件中可以获取的信息 MIDI 时间 ...

  2. [转]帐号登录事件(事件编号与描述)

    帐号登录事件(事件编号与描述) 作者:独孤行@winmag 来源:http://www.feelids.com/bbs/ 672 身份验证服务(AS)票证得到成功发行与验证. 673 票证授权服务(T ...

  3. 微信公众号获取事件监听

    微信公众号获取事件监听 使用到的工具类 XML (MessageUtil) 实体类(TextMessage) /*** 验证消息来自于服务器** @param signature* @param ti ...

  4. CertiK:重新部署其一号池事件分析

    "亡羊补牢,为时未晚",这句话在生活中的大部分时候均适用.然而,在面临网络安全时,牢破也许就会造成无法挽回的损失. 在安全问题未造成不可弥补的损失前就被发现,或是一开始便做好万全准 ...

  5. 9月13号魔兽服务器维护,魔兽世界9月13号重点事件汇总 魔兽世界下周要点一览...

    魔兽世界9月13号重点事件汇总 魔兽世界下周要点一览 2018-09-12 15:08:44来源:游戏下载编辑:野狐禅评论(0) <魔兽世界8.0>下周(9.13-9.19)即将迎来M奥迪 ...

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

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

  7. 【cocos2d-x入门实战】微信飞机大战之七:触摸事件和优先级

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11860007 飞机也登场了,子弹也可以正常发射了,但是不能动的飞机算神马回事 ...

  8. 如何理解控制反转和依赖注入

    如何理解控制反转和依赖注入 文章目录 如何理解控制反转和依赖注入 前言 一.什么是控制反转 1.何为依赖关系 2.进行控制反转的前的一些准备 3.控制反转的简单实现 2.1:实现代码 二.什么是依赖注 ...

  9. 帐号泄露事件频发,到底什么样的密码才安全?

    http://sspai.com/31659 前段时间,乌云曝光了网易邮箱存在的安全漏洞,尽管此事后来一波三折,网易一再否认,乌云也在漏洞页面上撤下了网易的名字,仅留下了「某邮箱」的字样,这其中的来来 ...

最新文章

  1. 在腾讯做只有10万人用的产品,这群工程师竟然还很高兴
  2. scratch学习_学习scratch编程能学到什么?对孩子有帮助吗?
  3. flv文件转换,完美解决
  4. 再次挑戰UCOSII内核源码
  5. [bzoj3531][Sdoi2014]旅行
  6. 程序员爬虫竟构成犯罪?
  7. nexus4恢复原生系统_深度好文!新浪微博架构师详析微博云原生技术的思考与实践...
  8. Springboot读取application.properties文件乱码
  9. 【word论文排版教程0】论文制作流程
  10. SkeyePlayer RTSP/RTMP低延迟播放器源码解析系列之效率优化方案
  11. 如何用VUE从零创建网站
  12. 浏览器window对象
  13. 经过spring cloud gateway 网关访问nacos上的服务
  14. 哥伦比亚大学 Schulzrinne 教授:撰写科研论文详细教程
  15. 成都Uber优步司机奖励政策(3月8日)
  16. pvr格式的用什么打开_cocos2d 查看pvr图片的详细格式
  17. 机械革命 无界16pro闪屏
  18. 淘淘商城第24讲——实现商品类目的选择
  19. 【转】编写高质量代码改善C#程序的157个建议——建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内...
  20. python假设税前工资和税率如下_【Python】税前税后工资转换

热门文章

  1. 密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码)
  2. 1 python数据分析概述
  3. 祝愿大家在新的一年里,万事大吉,送上我设计的可爱暴富小老虎微信红包封面,祝愿大家新的一年财运旺,事业旺,健康旺。
  4. Android UI库推荐
  5. matplotlib | Python强大的作图工具,让你从此驾驭图表
  6. [模型库]两款经典puma560机器人三维模型
  7. 腾讯游戏人生 android,腾讯游戏
  8. 影视剪辑,什么是蒙太奇,蒙太奇的含义
  9. String源码详解
  10. 关于道家与道教的总结