RTOS二值信号量和互斥量的区别


前言

信号量是一种高效的机制,用于实现任务间的通信与同步,以及确保对临界资源的互斥访问。它常被用于协调一组相互竞争的任务,以安全地访问共享资源。在多任务操作系统中,这种机制对于维护任务间的同步和防止资源冲突至关重要。

二值信号量与互斥信号量(通常简称为互斥量)在功能上相似,但存在几个关键差异:互斥量内置了优先级继承机制,这一特性有助于防止优先级反转问题,确保系统运行的稳定性和可预测性。相比之下,二值信号量则不直接支持优先级继承,因此它更多地被用于实现任务间的同步需求,包括任务间的直接同步以及任务与中断之间的同步。而互斥量更偏向应用于临界资源的访问。


(1)二值信号量的应用场景

假设信号量资源被获取了,信号量值就是 0,信号量资源被释放,信号量值就是 1,那么我们通常把这种只有 0 和 1 两种情况的信号量称之为二值信号量
在多任务系统中,二值信号量被广泛应用以实现任务间的同步。例如,当一个任务需要等待某个事件的发生(或某个条件的满足)时,传统的轮询方式会不断检查该条件是否成立,这不仅消耗了大量的CPU资源,还可能阻碍其他任务的执行。为了优化这一过程,任务可以在尝试获取二值信号量时进入阻塞状态(即挂起状态),从而允许CPU去执行其他任务。当特定事件发生时,另一个任务或中断服务例程会释放该二值信号量,将其值从0变为1,这一操作会唤醒之前因等待该信号量而阻塞的任务。被唤醒的任务随后会执行相应的操作,并在完成后继续其执行流程。

(2)互斥量的应用场景

互斥量是二值信号量的改进。它们之间最显著的区别在于互斥量引入了优先级继承机制,而标准的二值信号量则不具备这一特性。

具体来说,当一个临界资源被一个互斥量保护时,如果该资源正被一个低优先级任务所占用(即互斥量处于锁定状态,表示没有其他任务能获取该互斥量),此时若一个高优先级任务尝试访问该资源并请求该互斥量,由于互斥量已被占用,高优先级任务将会进入阻塞状态。为了防止这种情况导致的“优先级反转”问题(即低优先级任务长时间占用资源,导致高优先级任务无法执行),互斥量实现了优先级继承机制。

优先级继承机制的工作原理是:当高优先级任务因等待某个互斥量而被阻塞时,系统会临时提升当前持有该互斥量的低优先级任务的优先级,使其与高优先级任务的优先级相同。这一过程被称为“优先级继承”。通过这种方式,系统能够确保高优先级任务能够尽快获得所需的资源,从而减少其等待时间,并有效缓解或消除优先级反转带来的不良影响。

以下举一个优先级翻转的例子解释为什么需要使用优先级继承:
在一个包含H(高)、M(中)、L(低)三个优先级任务的多任务系统中,资源访问的优先级顺序自然遵循任务的优先级顺序。然而,当L任务正在使用一个受保护的资源时,若H任务急需该资源但无法立即获得,它会进入阻塞状态,等待L任务释放资源。这种场景下,高优先级的H任务被低优先级的L任务所“阻塞”,即发生了优先级翻转。

进一步地,如果在此期间M任务被唤醒,由于M任务的优先级高于L任务,它将抢占CPU执行权,中断L任务的执行,直到M任务完成并释放CPU。L任务随后继续执行,最终释放资源,此时H任务才得以从阻塞态恢复,继续其执行。这一过程中,H任务的等待时间不仅包括了L任务的执行时间,还可能因M任务的插入而延长,即总等待时间为M任务执行时间加L任务剩余执行时间。

在这里插入图片描述
时刻1:L 任务正在使用某临界资源, H 任务被唤醒,执行 H 任务。但 L 任务并未执行完毕,此时临界资源还未释放。
时刻2:这个时刻 H 任务也要对该临界资源进行访问,但 L 任务还未释放资源,由于保护机制,H 任务进入阻塞态,L 任务得以继续运行,此时已经发生了优先级翻转现象。
时刻3:某个时刻 M 任务被唤醒,由于 M 任务的优先级高于 L 任务, M 任务抢占了 CPU 的使用权,M任务开始运行,此时 L 任务尚未执行完,临界资源还没被释放。
时刻4:M 任务运行结束,归还 CPU 使用权,L 任务继续运行。
时刻5:L任务运行结束,释放临界资源,H 任务得以对资源进行访问,H 任务开始运行

在更复杂的系统中,如果存在多个类似的任务竞争同一资源,且未实施有效的优先级管理机制(如优先级继承),那么高优先级任务可能会长时间处于等待状态,无法及时响应关键操作,导致系统性能急剧下降,甚至影响到系统的稳定性和可靠性。这种现象对于需要高实时性和高可靠性的系统而言是绝对不可接受的。

因此,为了避免优先级翻转带来的危害,确保高优先级任务能够及时获得所需资源,系统必须实现优先级继承等机制。通过优先级继承,当高优先级任务因等待低优先级任务持有的资源而被阻塞时,系统可以临时提升低优先级任务的优先级,使其尽快完成资源释放,从而缩短高优先级任务的等待时间,提高系统的整体性能和响应能力。

参考

https://doc.embedfire.com/products/link/zh/latest/tutorial/ebf_freertos_tutorial.html
https://embedfire.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值