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

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

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. Java基础复习3

    循环的嵌套 public class demo8 {     public static void main(String[] args) {         /*  输出########       ...

  2. 微信登录1-OAuth2简介

    一.OAuth2解决什么问题 1.开放系统间授权 照片拥有者想要在云冲印服务上打印照片,云冲印服务需要访问云存储服务上的资源 2.图例 资源拥有者:照片拥有者 客户应用:云冲印 受保护的资源:照片 3 ...

  3. Linux Centos7之由Python2升级到Python3教程

    1.先查看当前系统Python版本,默认都是Python2.7,命令如下: [root@localhost gau]# python -V Python 2.7.5 2.安装Python3,安装方法很 ...

  4. 转 14 jmeter性能测试实战--数据库MySQL

    14 jmeter性能测试实战--数据库MySQL   需求 测试用户表(对用户表select操作) 测试步骤 1.MySQL驱动下载并安装. 2.测试计划面板点击"浏览"按钮,将 ...

  5. 同步与异步 Python 有何不同?

    你是否听到人们说过,异步 Python 代码比"普通(或同步)Python 代码更快?果真是那样吗? 1 "同步"和"异步"是什么意思? Web 应用 ...

  6. 浅析Linux进程空间布局

    一.进程空间分布概述 对于一个进程,其空间分布如下图所示: 1.参数说明 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初 ...

  7. Bitter.Core系列二:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之数据库连接

    Bitter.Core NETCore 相当的简单易用,下面附上使用示例: 数据中连接:请在你的NETCORE 项目中 创建:Bitter.json 配置文件,然后追加如下配置内容: MSSQL 连接 ...

  8. Pulsar Pub/Sub Messaging

    The Apache Software Foundation Announces Apache Pulsar as a Top-Level Project : The Apache Software ...

  9. Shell 简单入门教程

    大数据开发岗为什么要学习Shell呢?1)需要看懂大数据运维岗人员编写的Shell程序.2)偶尔会编写一些简单Shell程序来管理集群.提高开发效率 艺多不压身 Shell是一个命令行解释器,它接受应 ...

  10. 洛谷P4180

    被教练安排讲题 可恶 这道题我是十月初上课时花了一下午做出来的,当时连倍增都不会,过程比较困难,现在看看还可以 本来想口胡一发,后来想了想可能以后要用,还是写成文章吧 Description 求一棵严 ...