互斥信号量
  操作系统中利用信号量解决进程间的同步和互斥(互斥信号量)的问题,在多道程序环境下,操作系统就是遮掩实现进程之间的同步和互斥。但是在使用的过程中厉害的前辈还是发现了这一优秀机制的缺陷,它会导致优先级翻转从而出现系统部分功能瘫痪严重则会导致系统崩溃,互斥信号量的出现是为了解决优先级反转的问题的。根据互斥信号量的数据结构可以看出来互斥信号量和多值信号量在相关函数的操作是很相似的。

其中互斥信号量三个特有的不同变量的含义分别是:

1.OwnerTCBPtr

 这个元素记录了某时间段内唯一拥有互斥信号量的任务控制块指针 

2.OwnerOriginalPrio

 在任务等待互斥信号量时系统会调整拥有互斥信号量任务的优先级避免优先级反转,而这个变量就是保存优先级调整之前的优先级数,用于优先级还原

3.OwnerNestingCtr

 任务不仅可以占用互斥信号量还可以嵌套占用,每次占用就把这个值加1,当这个值为0时才说明当前任务使用完了信号量

优先级反转:

  优先级反转在可剥夺内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果。如下图(图片来源:原子USOC教程)

  图中的三个任务的优先级分别是高(H) 中(M) 低(L),其中中等优先级任务不需要请求信号量,其他两个任务执行会请求同一块资源也就是同一个信号量。系统在运行时会有这种情形,最低优先级的任务L先请求信号量并且成功请求到开始运行了,此时高优先级任务H和M就绪并H优先级最高拿走了CPU使用权,但是H任务内请求信号量的地方因为任务L还没有执行完所以还没有释放信号量导致H任务被挂起,此时CPU使用权就“风水轮流转”的到M任务,M任务开始执行直到执行完成,然后L任务才的以继续执行直到完成并释放掉信号量,最后H任务才能继续执行。这个过程中任务设计时如果计划让H任务完成了一些处理工作后才能执行任务M但是,似乎并没有按设计的流程执行导致中优先级的任务先于高优先级的人任务执行了,这就称之为优先级反转,这种现象在实际使用很可能导致严重的问题。

对于互斥信号量同样的三个优先级的任务,但在高任务请求信号量时因为互斥信号量此时被低优先级的任务拥有,所以会将L任务优先级暂时提高的H的水平,此时就可以理解互斥信号量内保存原优先级的变量的作用了就是在释放信号量时还原原优先级的备份,此时执行的过程就是最低优先级的任务L的以继续运行,此时高优先级任务H和M都就绪,但是L任务此时的优先级高于M所以CPU使用权还在L,当L执行完成后释放掉信号量优先级也降回原来的级数,此时H任务和M任务同样处于就绪状态并H拿走了CPU使用权,此时CPU使用权就不会给中优先级M然后M任务最后执行。这样执行顺序就没有问题了。

在前面多值信号量上的基础上互斥信号量的相关操作相对就简单好理解了不少;

1,创建互斥信号量

  定义一个互斥信号量,然后调用创建互斥信号量,同样每个信号量都有一个等待队列,且由OS_PEND_LIST变量管理,TailPtr指向等待队列的最后一个,Head指向第一个如图的数据结构;互斥信号量加入了信号量的拥有者来标记信号的当前拥有着任务。这点和多值信号量相同。

OSMutexCreate ()

2,请求信号量此时如果已经有低优先级的任务占有信号量要进行优先级的提升操作,提升了优先级也需要修改等待队列因为这个队列是按照优先级高低排序的,同时要是任务处于就绪状态也需要修改就绪列表里的顺序原因同上。

OSMutexPend ()

3,发布信号量

这里由于互斥信号量的属性决定的,互斥信号量的发布函数调用任务须先拥有互斥信号量。

OSMutexPost ()

其中的详细操作函数在多值信号量就已经见过了就是同多值信号量一样。

4,接下来就是一些强制解除等待,删除信号量函数等相关的函数了。这些函数其实就是对等待队列的一些修改函数和互斥信号量的整体原理关系不是十分紧密。

强制解除等待

OSMutexPendAbort ()

注意解除等待和删除函数的区别就是没有优先级继承恢复的相关操作,这个暂时还没有理解为什么。

删除信号量

OSMutexDel ()

这里主要区别一下多值信号量的相关操作的不同就可以,其基本的操作及原理都和多值信号量类似多了的部分就是其特点,也是其操作和多值信号量的不同点。

μC/OS-III---I笔记6---互斥信号量的更多相关文章

  1. FreeRTOS 二值信号量,互斥信号量,递归互斥信号量

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节讲解 FreeRTOS 任务间的同步和资源共享机制,二值信号量. 二值信号量是计数信号量的一种特殊形式 ...

  2. 基于μC/OS—III的CC1120驱动程序设计

    基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120   嵌入式操作系统   STM32F103ZE   ...

  3. 嵌入式系统FreeRTOS — 互斥信号量

    互斥信号量可以在资源保护的时候很有帮助.用于控制在两个或多个任务间访问共享资源.任务1里面用互斥,那么任务2只能等任务1访问完再访问同一个变量. 比如全局变量double gADC_value[CH_ ...

  4. ucos互斥信号量解决优先级反转问题

    在可剥夺性的内核中,当任务以独占方式使用共享资源的时候,会出现低优先级任务高于高优先级任务运行的情况,这种情况叫做优先级反转,对于实时操作系统而言,这是一场灾难,下面我们来说说优先级反转的典型环境. ...

  5. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  6. Linux 驱动——Button驱动6(mutex、NBLOCK、O_NONBLOCK)互斥信号量、阻塞、非阻塞

    button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...

  7. ucos之互斥信号量及优先级反转

    在ucos常使用共享资源来作为任务之间的通信方式,其中有:消息队列,信号量,邮箱,事件.信号量中又分二值信号,多值信号,互斥信号.这次主要讲二值信号与互斥信号之间区别和使用. 首先了解一下ucos的任 ...

  8. 【iCore4 双核心板_uC/OS-II】例程七:互斥信号量

    一.实验说明: 在介绍互斥信号量前,我们先简单地描述一下什么是优先级反转.使用实时内核心,优先级反转问题是实时系统中出现得最多的问题.假设任务H优先级高于任务M,任务M优先级高于任务L.任务H和任务M ...

  9. RTX——第15章 互斥信号量

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节开始讲解 RTX 的另一个重要的资源共享机制---互斥信号量(Mutex,即 Mutual Exc ...

  10. FreeRTOS互斥信号量

    API函数 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xSemaphoreCreateMutex() xQueueCreateMutex ...

随机推荐

  1. 解决安装mysql动态库libstdc++.so.6、libc.so.6版本过低问题

    初始化mysql报错: ./bin/mysqld: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ...

  2. 遍历仓库里的 commit log 替换author

    #!/bin/sh # 遍历仓库里的 commit log, 替换author git filter-branch --env-filter ' an="$GIT_AUTHOR_NAME&q ...

  3. 一体化的Linux系统性能和使用活动监控工具–Sysstat

    [转]原文出处: Tecmint-Kuldeep Sharma   译文出处:Linux Story-天寒   欢迎分享原创到伯乐头条 在监控系统资源.系统性能和使用活动方面,Sysstat的确是一个 ...

  4. 在HDFS中将文件从源路径移动到目的路径。

    import java.text.SimpleDateFormat; import java.util.Scanner; import org.apache.hadoop.fs.FSDataInput ...

  5. jdk安装逻辑学习笔记

    一.三个重要变量 很多软件需要用到jdk,安装的时候主要用到三个变量,那这三个变量的代表逻辑又是什么呢? 1.JAVA_HOME(JDK的安装目录)这个变量值选择的是jdk的安装目录 2.classp ...

  6. 【进阶】ZooKeeper 相关概念总结

    1. 开卷有益 学习是一种习惯,只有把这种习惯保持下来,每天不学习一点就感觉浑身不自在,达到这样的境界,那么你成为大佬也就不远了买,正如我们标题所写的"开卷有益".人生匆匆,要想过 ...

  7. LOJ2195 旅行

    LOJ2195 旅行 题目描述S 国有 N 个城市,编号从 1 到 N.城市间用 N-1 条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教. ...

  8. java中的IO处理和使用,API详细介绍(一)

    写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...

  9. KVM虚拟化(KVM简介和KVM安装)

    KVM 虚拟化架构分类 寄居虚拟化架构:指在宿主操作系统之上安装和运行虚拟化程序,依赖于宿主操作系统对设备的支持和物理资源的管理. 裸金属虚拟化架构:指直接在硬件上面安装虚拟化软件,再在其上安装操作系 ...

  10. io流读写操作

    /** * * DOC 将F盘下的test.jpg文件,读取后,再存到E盘下面. * * @param args * @throws Exception */ public static void m ...