FreeRTOS: 优先级翻转的典型场景
优先级翻转(Priority Inversion)是指在多任务操作系统中,尤其是实时系统中,一个高优先级任务因为等待一个低优先级任务持有的资源而被阻塞,导致高优先级任务不能及时得到执行的现象。这种现象可能会破坏系统的实时性,甚至引起系统不稳定或失效。
优先级翻转的典型场景
假设有三个任务:TA、TB 和 TC,它们的优先级分别为 TA > TC > TB(即 TA 是最高优先级任务,TB 是最低优先级任务)。当以下情况发生时,就会出现优先级翻转:
- TB 持有共享资源:假设 T3 正在使用某个需要互斥访问的共享资源(例如通过获取互斥信号量),此时它持有该资源。
- TA 需要相同的共享资源:接下来,高优先级任务 TA 开始运行,并尝试获取相同的共享资源。但由于资源已经被 TB 占用,TA 必须等待 TB 释放资源,因此 TA 被阻塞。
- TC 运行:在此期间,中等优先级的任务 TC 就绪并开始运行,因为它比被阻塞的 TA 优先级低但比 TB 高。这会导致 TB 不能立即运行以释放资源给 TA,反而继续让 TC 执行,即使 TA 的优先级更高。
- 结果:最终,高优先级任务 TA 的执行被延迟了,直到 TB 再次获得 CPU 并完成其对资源的操作,从而释放资源。这样的延迟可能违反了 TA 的实时性要求。
解决优先级翻转的方法
为了防止优先级翻转问题的发生,可以采用以下几种方法:
1. 优先级继承协议 (Priority Inheritance Protocol, PIP)
(补充知识点: 互斥信号量是包含优先级继承机制的二进制信号量。 二进制信号量能更好的实现同步(任务间或任务与中断之间),而互斥信号量有助于更好实现简单互斥(即相互排斥))
- 原理:当高优先级任务因等待低优先级任务持有的资源而被阻塞时,临时提升低优先级任务的优先级到与高优先级任务相同的水平,使得低优先级任务能够尽快完成对资源的操作并释放资源,然后恢复其原始优先级。
- 优点:简单有效,能迅速解决问题,且不需要额外的资源开销。
- 缺点:如果多个高优先级任务同时等待同一个低优先级任务持有的资源,可能导致复杂的优先级调整。
(注意:优先级继承协议并不能完全解决优先级翻转,只是在某些情况下将影响降至最低
不能在中断中使用互斥信号量, 原因如下:
1、互斥信号量使用的优先级集成机制要求从任务中(而不是从中断中)获取和释放互斥信号量
2、中断无法保持阻塞来等待一个被互斥信号量保护的资源。
)
适用场景
- 大多数实时嵌入式系统:特别是那些对响应时间和资源使用效率有较高要求的系统,如汽车电子、工业控制等。
2. 优先级天花板协议 (Priority Ceiling Protocol, PCP)
- 原理:每个资源都关联一个固定的“天花板”优先级,等于所有可能请求该资源的任务中的最高优先级。任何试图获取此资源的任务都会暂时将其优先级提升至该天花板值,直到它释放资源为止。
- 优点:避免了多个任务间的复杂优先级调整,确保了最坏情况下也能满足实时性需求。
- 缺点:可能会造成一些不必要的优先级提升,导致较低优先级的任务过早抢占较高优先级的任务。
适用场景
- 严格实时系统:例如航空电子设备、医疗设备等领域,这些领域对系统的可靠性和可预测性有着极高的要求。
3. 避免长时间持有共享资源
- 设计建议:尽量减少任务持有共享资源的时间长度,这样即使发生优先级翻转,影响也会较小。可以通过优化算法、分割大操作为小步骤等方式来实现这一点。
实际应用
在大多数实际应用中,优先级继承协议 (PIP) 是首选方案,因为它提供了较好的平衡——既能有效防止优先级翻转,又不会显著增加系统的复杂性和资源消耗。它被广泛应用在各种实时嵌入式系统中,并且得到了许多操作系统的原生支持。然而,对于那些对实时性有极端苛刻要求的应用(如航空航天和医疗设备),则可能更倾向于采用优先级天花板协议 (PCP) 来确保最严格的实时保障。最后,无论选择哪种方法,都应该尽量遵循避免长时间持有共享资源的最佳实践,以进一步优化系统的稳定性和性能。