嵌入式OS入门注意事项-同RTX案件:九.关于优先-翻转,继承和天花板

涉及当调度优先级,会有很多问题,本文中,优先调度和一些战略的主要问题,以应付。

有几个概念如下:(priority inversion),优先度继承(priority inheritance)策略和优先度天花板(priority ceiling)策略。

1.优先度翻转(priority inversion)

大部分的RTOS都支持给不同进程分配优先度,一定程度上可以让调度和时间管理灵活性更大。

可是当涉及到一些代码临界区(critical section)的时候,可能就会出现故障。优先度翻转就是这样一个典型的问题。为了解释这个概念,我们先来看一个实际样例:

首先我们考虑三个进程,T1。T2,T3。

T3的优先度大于T2,T2的优先度大于T1,採用的调度算法是优先度高的能够打断优先度低的进程,临界区等待能够阻断高优先度的进程。

考虑在一个时间轴上。下面事件依次发生:

  1. T1被创造
  2. T1要求进入资源R临界区
  3. T2被创建
  4. T3被创建
  5. T3要求进入资源R临界区

光看文字可能会比較抽象。我们把每一个事件都画在下图:

请先依照时间顺序从左到右看一下全部事件。有没有认为有什么不妥的?

假设没有认为不妥的,我们再依照每一个进程来看。进程1首先被创建。然后进入了临界区运行,然后被阻断,然后又一次进入临界区运行。中间的阻断时间是三个进程最长的。

进程2第二被创建。一创建就打断了进程1,直到被阻断,然后恢复正常运行直到进程消灭。进程3最后被创建。一创建就打断了进程2,直到要求进入临界区被阻断。然后再恢复临界区运行,阻断时间是三个进程中第二长的。

问题恰恰出如今这里:进程3被什么阻断了?进程3由于要求资源R的临界区,而此时资源R临界区被进程1占用。理想状态我们应该让进程1尽快运行尽早退出临界区。以便进程3(当前最高优先度)可以及早运行。可实际上,由于进程1被进程2阻断(进程2优先度比进程1优先度高),所以进程2阻断了希望继续在临界区运行的进程1。直到进程2完毕!

所以,进程3实际上是被进程2阻断了,低优先度的进程阻断了高优先度的进程,这就是优先度翻转问题。(临界区运行阻断不属于优先级阻断。而是资源阻断。

)上面这个样例,假设我们把进程2的运行时间无限延长的话,进程3就全然没有办法继续运行了。

也就是说。理想情况下。我们希望高优先度的进程的最大阻断时间受限于低优先度进程的临界区运行时间之和,实际上在这样的最简单的设定下。高优先度的最大阻断时间是低优先度进程临界区运行时间之和加上优先度高于临界区运行进程的进程的运行时间之和。

一个简单的解决方式,就是在临界区时禁止中断,虽然这个确实可以解决优先度翻转问题,但我们假设考虑例如以下的情况:

这相当于无条件地阻断了进程2和进程3,显然不是我们想要的结果。

2.优先度继承(priority inheritance)

一个比較好的解决的方法就是优先度继承。

优先度继承的意思是,将临界区内的进程的优先度提高为该进程阻断的进程里的优先级最高进程的优先级。这么说可能还是非常绕。我们看一下这个办法详细如何解决我们上面提到的样例的:

当进程3要求进入R临界区运行时,由于被进程1阻断了,进程1此时在临界区内,并且它阻断的是进程3,那么此时它的优先度就会提升为进程3的优先度,也就是说继承了进程3的优先度。

当退出临界运行区后,进程1优先度又会降为原先的优先度。

这就非常好地攻克了高优先度进程被无条件阻断的问题,上面这个样例里面,进程3的阻断时间事实上仅仅是进程1临界区运行的时间。

但这也会引起死锁的问题。我们看以下这个样例:

  1. T1被创造
  2. T1要求进入资源A临界区
  3. T2被创建
  4. T2要讲求进入资源B临界区
  5. T2要求进入资源A临界区
  6. T1要求进入资源B临界区

当进程2要求资源A临界区时,由于进程1正在资源A临界区内。所以其优先级继承了进程2的优先级,但进程1运行了一段时间后又要求进入资源B临界区以完毕当前任务。退出临界区A。两个进程此时都在等待对方退出临界区。而自己却不会主动退出自己占有的临界区,所以死锁。

3.优先度天花板(priority ceiling)

这个策略就是为了解决优先度继承的死锁问题。

详细说来就是,为每一个资源定义优先度天花板,资源的优先度天花板是全部可能要相互排斥使用该资源的进程的最高优先度。

这样的策略仅仅同意满足一个条件的进程去进入临界区,而这个条件就是。该进程的优先度要大于(等于不足够)。全部其它进程占用的资源的优先度天花板的最高优先度。同一时候保留优先度继承策略。 我们看一下上面这个样例,优先度天花板会如何处理:

当进程2想进入资源B临界区时,被阻断了,由于它优先度并不大于其它进程(进程1)占用资源(A)的优先度天花板(进程2的优先度),被进程1阻断,与此同一时候。进程1的优先度提升为进程2的优先度,继续运行,直到退出两个临界区。

4.小结

RTX的相互排斥锁和信号量有内嵌的优先度继承策略,可是没有内嵌的优先度天花板策略,所以假设你的代码涉及了2个以上独占资源。请留心避免死锁。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

嵌入式OS入门注意事项-同RTX案件:九.关于优先-翻转,继承和天花板的更多相关文章

  1. 嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度

    嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度 上一篇笔记介绍了一些绕开排程器(或调度程序,scheduler)来进行时间管理的一些小方法.这一篇详细介绍RTX的任务调度原理. RTX主要有 ...

  2. 基于嵌入式OS的任务设计-----任务划分

    在<前后台系统VS嵌入式OS,何时该上OS?>一文中介绍了何时应该将OS应用于嵌入式设计中,本文将介绍基于OS的任务设计,一般来说,应用程序设计包括两个方面,一个是业务逻辑的设计,另一个是 ...

  3. Linux入门——注意事项

    Linux入门——注意事项 摘要:本文主要说明了在使用Linux操作系统时,需要注意的问题. 严格区分大小写 和Windows不同,Linux是严格区分大小写的,包括文件名和目录名.命令.命令选项.配 ...

  4. 嵌入式OS的现状、智能的物联网与未来的机器人

    嵌入式开发是一个低调的领域.相比Web开发和企业级开发,嵌入式开发这一领域似乎很少在互联网上发出声音.随着智能设备的兴起,智能手环.手表.眼镜.灯泡等产品成为互联网企业的下一个目标,而物联网这一概念再 ...

  5. C入门注意事项

        C语言入门应该注意什么   进入IT行业,很多人一开始接触的都是C语言,C语言可以说是一门基础课程了,只要有了C语言的基础,那么以后不管是学什么语言都会比较容易上手.同时在学习其它语言时也可以 ...

  6. [嵌入式开发入门]4412开发板从零建立Linux最小系统

    本文转自iTOP-4412开发板实战教程书籍 http://www.topeetboard.com iTOP-4412开发板不仅可以运行Android,还可以运行简单的Linux最小文件系统. 最小L ...

  7. 嵌入式LINUX入门到实践(二)

    这篇中将围绕韦东山LINUX第二部分教程源码,对IIC协议进行程序实现上的分析. /* I2C registers */#define IICCON      (*(volatile unsigned ...

  8. 嵌入式LINUX入门到实践(一)

    MINI2440 IIC协议 IIC协议在工程中应用广泛,在我看来,此协议的优势就在于其硬件及其简单,结构清晰. 首先来解读一下S3C2440A这款芯片的IIC协议. 一.一个协议的解读从如上结构图中 ...

  9. Linux基础入门(新版)(实验九-实验十二)

    实验九 简单文本入门 一.常用的文本处理命令 二.文本处理命令 1.tr 命令 tr 命令可以用来删除一段文本信息中的某些文字.或者将其进行转换. 使用方式: tr [option]...SET1 [ ...

随机推荐

  1. 关于fatfs生成的wav文件是空,大小是0的问题

    绝大多数是因为打开错误 调试的时候,编写程序的时候 要记得res=f_open() 要有返回值res的设置

  2. [译]基于Vue.js的10个最佳UI框架,用于构建移动应用程序

    原文查看10 Best Vue.js based UI Frameworks for Building Mobile Apps 如果您期待使用Vue.js构建移动应用程序,那么您可以选择许多可用的UI ...

  3. api接口安全以及https

    一:加密方法: 1,对称加密 AES,3DES,DES等,适合做大量数据或数据文件的加解密. 2,非对称加密 如RSA,Rabin.公钥加密,私钥解密.对大数据量进行加解密时性能较低. 二:https ...

  4. [慕课笔记]mongodb入门篇

    一:对mongodb有一个系统的完备的了解,只有概念清楚了,才能更好的使用 二:学会mongodb数据库的搭建 首先:了解如何部署数据库的服务 搭建简单的单机服务到搭建具有冗余容错功能的复制集再到搭建 ...

  5. 【27.85%】【codeforces 743D】Chloe and pleasant prizes

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. ios开发核心动画三:隐式动画与时钟效果

    一:隐式动画 #import "ViewController.h" @interface ViewController () /** <#注释#> */ @proper ...

  7. jquery-10 js加载的时机如何选择

    jquery-10 js加载的时机如何选择 一.总结 一句话总结:主要应用widow的ready()方法和load()方法. 1.内部文件中DOM加载完毕执行js如何书写? 把js标签放在body之后 ...

  8. XML输出到浏览器报错

    在使用Firefox浏览器测试我编写的xml文件时,遇到如下错误:我的xml源代码如下: <?xml version="1.0" encoding="UTF-8&q ...

  9. Java开发报表——Grid++Report 报表设计器

    为了让数据显示的更加形象生动,报表在项目中差点儿是很常见的,可是大致能够分为两类: 一,图形:以图形的形式显示数据,比如柱状图,折线图,饼形图等等,这里有许多关于这方面的工具,比如JFreeChart ...

  10. Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...