QNX的优先级继承很有意思,解决了在消息发送过程中Server处理线程的响应问题。
以下内容来自QNX官网,用个人理解的角度进行说明。
操作系统的设计中,特别是实时操作系统(RTOS)中,优先级反转是一个常见的问题,可能导致系统性能下降和任务执行延迟。为了解决这一问题,引入了一种智能调度策略,即优先级继承和message传递。本文将深入探讨这种策略的工作原理以及如何有效地解决优先级反转。
1. 优先级继承
在这种智能调度策略中,我们将服务器线程称为 server
,而客户端线程则称为 client
。 server
进程按照优先级顺序接收message和pluse。当 client
线程向 server
发送请求时,server
将继承发送线程的优先级,但不继承调度策略。这确保了请求 server
工作的线程相对优先级得以保留,从而在执行 server
工作时能够以适当的优先级执行。这种基于 message 的优先级继承机制成功地避免了优先级反转问题。
2. 解决优先级反转
在没有优先级继承的情况下,如果低优先级的 client
向高优先级的server
发送 message,实际上是以高优先级(例如 server
的优先级)完成工作,导致了优先级反转。
通过优先级继承,当 server
接收到 message 时,它的有效优先级将更改为最高优先级client
的优先级。这种机制避免了优先级反转问题的发生。
举例说明,假设系统有以下线程:
- 一个
server
线程,优先级为22 - 一个
client
线程T1,优先级为13 - 一个
client
线程T2,优先级为10
如果没有优先级继承,当T2向 server
发送 message 时,实际上是以22的优先级为其完成工作,造成T2的优先级反转。然而,通过优先级继承,server
接收到 message 后会将其优先级提升到最高发送者的优先级也就是10,解决了优先级反转这一问题。
3. 实现机制
当 server
接收到 message 时,其有效优先级会相应更改为最高优先级发件人的优先级。这种更改在 message 到达之前发生,以避免另一种优先级反转情况。如果 server
的优先级在10不变的情况下,另一个线程T3以11的优先级开始运行,server
必须等待T3释放CPU时间,以便最终接收T1的 message,避免由低优先级线程T3导致T1被延迟的情况。
4. 关闭优先级继承
可以通过在调用 ChannelCreate() 时指定 _NTO_CHF_FIXED_PRIORITY 标志来关闭优先级继承。这一标志同时适用于自适应分区,使得接收线程不会在发送线程的分区中运行。
5. server优先级提升
如果高优先级线程在 server
上被 SEND-block,kernel会尝试找到一个或多个可能在给定通道上接收的线程,并提升它们的优先级,以确保高优先级任务得以尽快执行。
通过这种智能调度策略,系统能够更有效地处理任务,避免因优先级反转而引起的性能问题。在设计实时系统时,考虑并实现类似的机制对于确保系统的可靠性和性能至关重要。