文章目录
- 信号量
- 信号量简介
- 信号量特征
- 互斥量
- 互斥量的上锁机制
- 互斥量的优先级继承机制
- 二值信号量和互斥量的作用
- 二值信号量的作用
- 互斥量的作用
- 二值信号量和互斥锁关系
- 相同点
- 不同点
- 如何根据场景选择
- 回答信号量和互斥锁之间的区别:
信号量
信号量简介
-
队列(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创建不同
如何根据场景选择
-
根据场景选择合适的同步机制
- 互斥量是包含优先级继承机制的二值信号量。二值信号量是实现同步(任务之间或任务和中断之间)的更好选择,而互斥量是实现简单互斥的更好选择,虽然互斥量也可以用于任务与任务之间、任务与中断之间的同步,但是互斥量更多用于保护共享资源的互锁。
-
根据优先级设计同步机制
- 因为二值信号量没有优先级继承继承,所以二值信号量相对适合优先级高的任务。
回答信号量和互斥锁之间的区别:
- 互斥量
是一个特殊的二值信号量
,特殊点在于互斥量具有优先级继承,优先级继承的特点是任务上锁期间其他任务无法进行抢占,这就导致上锁的低优先级的任务可以先运行,所以互斥锁的应用场景更多是在于保护公共资源,而二值信号量适合任务与任务或中断与任务之间的同步,因为在中断服务程序中,二值信号量不会阻塞,互斥量可能会阻塞。