FreeRTOS的信号量和互斥量之间的区别和联系

news2024/11/24 7:06:01

文章目录

  • 信号量
    • 信号量简介
    • 信号量特征
  • 互斥量
    • 互斥量的上锁机制
    • 互斥量的优先级继承机制
  • 二值信号量和互斥量的作用
    • 二值信号量的作用
    • 互斥量的作用
  • 二值信号量和互斥锁关系
    • 相同点
    • 不同点
  • 如何根据场景选择
  • 回答信号量和互斥锁之间的区别:

信号量

信号量简介

  • 队列(queue)可以用于传输数据:在任务之间、任务和中断之间,消息队列用于传输多个数据,占用时间按也相对较长,但是有时候我们只需要传递状态,这个状态值需要用一个数值表示,一般是用作同步的效果

  • 所有的信号量的本质的都是特殊的队列(特殊:信号量只有队列头部,并没有后面的环形存储区,也就是说信号量只负责消息传递,并不传递数据)信号量用来进行共享资源的管理和任务同步【ps:信号量里面的二值信号量用于同步】

信号量特征

  • 信号量这个名字,我们可以把它拆分来看,信号可以起到通知信号的作用,然后我们的量还可以用来表示资源的数量,当我们的量只有0和1的时候,它就可以被称作二值的信号量,只有两个状态,当我们的那个量没有限制的时候,它就可以被称作为计数型信号量

信号量也是队列的一种

  • 因为队列创建的时候,需要传入队列的长度以及队列的大小,而我们的信号量其实就是一种特殊的队列,只不过它的大小是0,毕竟我们的信号量是不需要传递数据,只需要传递信号,然后长度是N,当N=1的时候就是二值信号量,他就只有0和1两个状态,这里的0和1两个状态是指被填入和被拿走这两个状态,当N>1时,就是我们的计数信号量,他也不传递数据,只是传递一个数量值,一般是记录我们设备的资源数量

二值信号量:

  • 二值信号量其实就是一个长度为1,然后大小为零的队列,然后它的状态只有0和1两种状态,也就是被写入和被取走的两种状态,通常情况下,我们用它来进行数据同步,就像平时在程序中设置的那个变量flag

计数信号量:

  • 计数信号量其实就是二指信号量的升级版,那只是信号量只有0和1两种状态,而我们的这个就有很多种状态,通常情况下是用来记录系统的资源,就比如说我们记录一个车库里的辆车,每当有人来停车或者取车的时候他的数量都会进行对应的加减,我们就可以很轻松的看到我们车库的状态,然后也知道车库里面有几辆车

互斥量

互斥量的上锁机制

  • 由于上面的那种情况导致我们的二值信号量,通常都是用来进行数据的同步一个负责发送数据,然后一个负责同步数据,而互斥量,其实它更像一个上锁的机制,两个任务需要公用一个资源,所以我们可以把互斥量又叫做互斥锁

互斥量的优先级继承机制

  • 互斥量的出现就是去弥补二值信号量的缺点,使得上锁的低优先级的任务可以先运行,然后是有锁的高优先级的任务,最后才是中间优先级的任务

优先级继承机制:上锁期间其他任务无法进行抢占

二值信号量和互斥量的作用

二值信号量的作用

  • 同步:中断与任务之间使用信号量来完成同步,同样,任务与任务之间也可以使用信号量来完成同步。

  • 共享资源管理:二值信号量也可以用于共享资源的管理。举个例子一个共享资源,一次只能一个任务使用且只有使用和未使用两种状态。使用共享资源的两个状态作为信号量的话,那么这就是二值信号量。

互斥量的作用

  • 互斥量(mutex)又称互斥信号量,是一个特殊的二值信号量,可以通过它来确保执行流在代码关键区互相排斥,从而对共享资源进行独占式处理。互斥量是二进制信号量的一个变种,开启互斥量需要在头文件FreeRTOSConfig.h中设置configUSE_MUTEXES为1。任意时刻互斥量的状态只有两种,开锁或闭锁。

二值信号量和互斥锁关系

相同点

  • (1)同为用于多线程(任务)条件同步的机制

  • (2)都可用于对共享资源的保护

不同点

  • (1)优先级反转问题

    • 互斥量和二值信号量最大的区别就是:互斥量具有优先级继承。例如,低优先级的任务A持有互斥量的时候,优先级高的任务B开始尝试获得这个锁。但是任务B无法获取互斥量而进入阻塞状态。正在使用互斥量的任务A会临时将优先级提升到任务B的优先级。这个优先级提升的过程就是优先级继承。这个机制用于确保高优先级任务进入阻塞状态的时间尽可能地短。

    • 实例:
      在这里插入图片描述
      互斥量的出现就是去弥补二值信号量的缺点,使得上锁的低优先级的任务可以先运行,然后是有锁的高优先级的任务,最后才是中间优先级的任务

  • (2)应用的优势场景不同:

    • 二值信号量更适合用于用于任务与任务或中断与任务之间的同步,互斥量更适合用于互斥,用于保护保护只能有一个任务访问的共享资源

    • 互斥量不能用于中断服务程序中,信号量可以。因为互斥可能会阻塞,但是中断不能阻塞等待;而且互斥量有优先级继承机制,只有互斥量从任务中释放和获取时才有意义,而不是中断

  • (3)使用API创建不同

如何根据场景选择

  1. 根据场景选择合适的同步机制

    • 互斥量是包含优先级继承机制的二值信号量。二值信号量是实现同步(任务之间或任务和中断之间)的更好选择,而互斥量是实现简单互斥的更好选择,虽然互斥量也可以用于任务与任务之间、任务与中断之间的同步,但是互斥量更多用于保护共享资源的互锁。
  2. 根据优先级设计同步机制

    • 因为二值信号量没有优先级继承继承,所以二值信号量相对适合优先级高的任务。

回答信号量和互斥锁之间的区别:

  • 互斥量是一个特殊的二值信号量,特殊点在于互斥量具有优先级继承,优先级继承的特点是任务上锁期间其他任务无法进行抢占,这就导致上锁的低优先级的任务可以先运行,所以互斥锁的应用场景更多是在于保护公共资源,而二值信号量适合任务与任务或中断与任务之间的同步,因为在中断服务程序中,二值信号量不会阻塞,互斥量可能会阻塞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/960079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity AssetBundle(1):Assets打包和依赖(Dependencies)

对Unity5.x后的AssetBundle依赖机制有了一点理解,创建了一个项目验证 github:GeWenL / AssetBundlePro AbScene.unity 资源有哪些? Some common types of Asset assetbundle打包命令是 BuildPipeline.BuildAssetBundles ,格式有: 引用&…

vue3+ts组件通信

1、父组件向组件传参 父组件代码 子组件代码 2、子组件向父组件传参 组件间代码 父组件代码 3、如果eslint报错,需在.eslintrc.js中添加一行代码 4、通过父组件通过 ref 获取子组件的属性或者方法 父组件代码 子组件代码 5、孙子组件provide和inject 父组件…

重磅!腾讯云 CODING 入选软件供应链产品名录

点击链接了解详情 2023 年 8 月 25 日,由中国信息通信研究院、中国通信标准化协会联合主办的**“2023 首届 SecGo 云和软件安全大会”在京召开。会上正式发布了第二期《软件供应链厂商和产品名录》,旨在提升软件供应链透明度,宣传推广一批成熟…

Ceph构件及组件分析

Ceph存储架构 Ceph 存储集群由几个不同的daemon组成,每个daemon负责Ceph 的一个独特功能并。每个守护进程是彼此独立的。 下面将简要介绍每个Ceph组件的功能: RADOS(Reliable Autonomic Distributed Object Store, RADOS) RADOS…

Python面向对象编程(一)类的基础,关系,继承,封装,多态

类的一些理论概念及其应用场景等基础内容此处不赘述 目录 类的定义及基础 属性 方法 初始化方法 普通方法 类之间的关系 相互调用 依赖关系 关联关系 组合关系 三大特征----类的继承 重写父类方法 多继承 三大特征----封装 三大特征----多态 类的定义及基础 类…

10 mysql tiny/small/medium/big int 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 int 类类型的相关数据的存储 …

EI、Scopus双检索| 2023年第四届自动化、机械与设计工程国际会议

会议简介 Brief Introduction 2023年第四届自动化、机械与设计工程国际会议(SAMDE 2023) 会议时间:2023年12月8 -10日 召开地点:中国南京 大会官网:www.samde.org 机械设计制造及其自动化学科在国民经济中处于极其重要…

从渗透测试小白到网络安全大佬的成长之路

前言 最近看到很多的安全小白在询问如何去学习安全,如何去入手渗透测试等问题。突然有感而发,想起来自己当时从小白一步一步走向黑客大佬的成长之路。 随着因特网的发展和网络经济的兴起, 越来越多的企业将服务或交易平台放到了互联网上, 而且这些网络应…

es6解构用法

一: 解构数组 二:解构对象 一: 解构数组 原理:模式(结构匹配), 索引值相同的完成赋值 总结:位置对应 二:解构对象 原理:模式(结构匹配), 属性名相同的完成赋值 {}{} 对象结构赋值的应用 常用的就以上两种 &#…

【用unity实现100个游戏之7】从零开始制作一个仿杀戮尖塔卡牌回合制游戏

文章目录 前言素材资源开始一、UI框架二、挂载脚本三、事件监听,用于绑定按钮事件四、声音管理器五、excel转txt文本六、游戏配置七、用户信息表八、战斗管理器九、 敌人管理器十、玩家血量、能量、防御值、卡牌数十一、敌人血量 行动显示逻辑十二、UI提示效果实现十…

缓存技术(缓存穿透,缓存雪崩,缓存击穿)

大家好 , 我是苏麟 , 今天聊一聊缓存 . 这里需要一些Redis基础 (可以看相关文章等) 本文章资料来自于 : 黑马程序员 如果想要了解更详细的资料去黑马官网查看 前言:什么是缓存? 缓存,就是数据交换的 缓冲区 (称作Cache [ kʃ ] ),俗称的缓存就是缓冲区内的数据,是存贮数据的…

20230901工作心得:IDEA列操作lambda表达式加强版用法

今天是中小学开学时间,亦是9月的开始,继续努力。 今日收获较大的有四个地方,先说这四点。 1、IDEA列操作 使用场景:需要批量将Excel表格里的数据插入到数据库中,此时需要写大量的insert SQL语句。 比如像这样的&am…

MySQL - 函数

1.1 什么是函数? 要想实现上面的这些效果,就得借助于MySQL当中的内置函数。 函数:是指一段可以直接被另一段程序调用的程序或代码。 MySQL当中内置了很多的函数,根据其操作的数据类型,分为以下四类: 字符…

vue之若依字典的导入使用(不直接使用若依框架,只使用若依字典)

vue之若依字典的导入使用 若依官网:http://ruoyi.vip 若依演示地址:http://vue.ruoyi.vip 若依代码下载:https://gitee.com/y_project/RuoYi-Vue 以上地址是若依的相关地址,可以下载前后端分离版的若依前后端代码。 如果你不想直…

【附安装包】Multisim 14.0安装教程|电子电路

软件下载 软件:Multisim版本:14.0语言:简体中文大小:649.68M安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.5GHz 内存4G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.bai…

深度学习基础篇 第二章: 转置卷积

参考教程: https://arxiv.org/pdf/1603.07285.pdf 文章目录 什么是转置卷积转置卷积的思想一维形式的理解二维形式的理解卷积和转置的关系no pading, unit stridespadding, unit stridesno padding, non-unit stridepadding,non-unit stride pytorch中的…

ububtu部署bind-dns 问题

启动(重启)命令如下: sudo systemctl restart bind9查看状态命令如下: sudo systemctl status bind9停止命令如下: sudo systemctl stop bind9#配置自己的域 要修改一下路径的文件(named.conf.local): 在这个文件named.conf.loca…

java从入门到起飞(六)——用Socket实现网络通信

文章目录 背景网络编程网络编程三要素 2.DatagramSocket之UDP通信程序2.1 UDP发送数据2.2UDP接收数据2.3 3. Socket之TCP通信程序3.1TCP发送数据3.2TCP接收数据 背景 网络编程 ● 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线…

开始MySQL之路——MySQL 函数(详细讲解)

MySQL 函数 在MySQL中,为了提高代码重用性和隐藏实现细节,MySQL提高了很多函数。函数可以理解为别人封装好的模块代码。 在MySQL中,函数非常多,主要可以分为以下大类: 聚合函数:这类函数就是用来做简单的…

[深度学习]1. 深度学习知识点汇总

本文记录了我在学习深度学习的过程中遇到过的不懂的知识点,为了方便翻阅,故将其发表于此,随时更新,供大家参考。 深度学习常见知识点 1. 测试精度和训练精度 在深度学习中,测试精度和训练精度是两个重要的指标&#…