嵌入式OS入门笔记-以RTX为案例:九.关于优先度-翻转,继承和天花板

嵌入式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为案例:九.关于优先度-翻转,继承和天花板

时间: 2024-10-20 23:50:43

嵌入式OS入门笔记-以RTX为案例:九.关于优先度-翻转,继承和天花板的相关文章

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持 调试(debug)是软件开发的一个重要环节,对于嵌入式开发而言这个环节其实比较依赖一些硬件资源(硬件debugger)的支持.传统的嵌入式系统的调试比较依赖断点(breakpoint)和单步调试(single step through).而 ARM cortex-M 系列的芯片其实有很强的CoreSight片上调试支持,实际上就是一个小的调试硬件,作为ARM的标准,内嵌在ARM的芯片里.在ARM自家的调试器ULINK-pro等的帮

嵌入式OS入门笔记-以RTX为案例:八.RTX的进程间通讯(二)

嵌入式OS入门笔记-以RTX为案例:八.RTX的进程间通讯(二) RTX的进程间通讯主要依赖于四种机制,分别是事件(Event),互斥锁(Mutex),旗语或信号量(Semaphore),和邮箱(Mailbox).前三种机制侧重进程间的同步,邮箱则侧重进程间的数据通讯.这次讲一下信号量和邮箱. 1.信号量(Semaphore) 1.简介 信号量其实是一个很抽象的操作系统原语,它最早由荷兰计算机科学家Dijkstra提 出,用于解决多项资源的分配问题.实际上信号量的适用范围非常广,可以很好地解决很

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

嵌入式OS入门注意事项-同RTX案件:九.关于优先-翻转,继承和天花板 涉及当调度优先级,会有很多问题,本文中,优先调度和一些战略的主要问题,以应付. 有几个概念如下:(priority inversion),优先度继承(priority inheritance)策略和优先度天花板(priority ceiling)策略. 1.优先度翻转(priority inversion) 大部分的RTOS都支持给不同进程分配优先度,一定程度上可以让调度和时间管理灵活性更大. 可是当涉及到一些代码临界区(c

嵌入式开发学习笔记 ( java - c/c++ :从入门到入门 )

发现放到Blog之后排版全乱套了.. 已经把PDF上传到资源页了  http://download.csdn.net/detail/lyy289065406/8934637 那边排版好看一点...看官们随意吧 >...< · 目 录 导 航 1. 引言 1.1. 编写目的 1.2. 阅读范围 1.3. 声明 1.4. 缩写词/名词解释 1.5. 参考资料 2. 嵌入式开发学习笔记 2.1. 开发环境/测试环境 2.2. 开坑:提要 2.3. 入坑:JNI 2.3.1. navicate 接口定

redis入门笔记(2)

redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化,这是相对memcache来说的一个大的优势.redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式. Snapshotting        快

Django入门笔记【二】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. 1. 创建管理员(admin user) 运行代码 1 $ python manage.py createsuperuser 2 3 Username: admin 4 Email address: [email protected] 5 6 Password: ********* 7 Passw

MySQL入门笔记(一)

MySQL入门笔记(二) 一.数据类型 1. 整型 2. 浮点型 3. 字符型 4. 日期时间型 二.数据库操作 1. 创建库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name; ??上述代码中DATABASE和SCHEMA完全相同,可任选一个(花括号内的参数为任选其一): ??添加IF NOT EXISTS的作用则是,若新建数据库的名称与已有数据库名称冲突,则产

Django入门笔记【一】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. 1. 查看Django是否安装及版本 1 $ python -c "import django; print(django.get_version())" 2. 创建一个项目(project) 通过cd方式进入自创目录,然后运行: 1 $ django-admin startprojec

Ajax 入门笔记

AJAX =Asynchronous Javascript + XML,是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. XMLHttpRequest 是 AJAX 的基础.XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 1:创建 XMLHttpRequest 对象 为