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

信号量

信号量简介

  • 队列(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. 根据优先级设计同步机制

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值