在实时操作系统(RTOS)的设计中,调度器(Scheduler)是其灵魂。为了保证系统的实时性,调度器必须在极短的时间内确定下一个要运行的任务。对于基于优先级的抢占式调度算法,核心问题是:如何从所有处于就绪态的任务中,快速找到优先级最高的那一个?
今天我们就来深入探讨 RTOS(如 μC/OS-II)中经典的“查表法”,看它如何利用空间换时间,实现 O(1) 时间复杂度。
一 、问题的引入:为什么不用循环?
假设RTOS系统有 64 个优先级(0-63),数值越小优先级越高。我们通常用一个 64 位的变量(或包含 8 个 uint8_t 的数组)来记录任务状态,每一位代表一个优先级任务的状态:1 表示就绪,0 表示未就绪。
最直观的方法是从第 0 位开始向后扫描,直到发现第一个为 1 的位。
最好情况: 第 0 位就是 1,查 1 次。
最坏情况: 只有第 63 位是 1,查 64 次。
这种 O(n) 的算法在实时系统中存在隐患:调度时间不确定(Non-deterministic)。在高频触发的滴答中断中,这种耗时的波动性可能导致任务抖动过大。
后续内容可看网页链接
今天我们就来深入探讨 RTOS(如 μC/OS-II)中经典的“查表法”,看它如何利用空间换时间,实现 O(1) 时间复杂度。
一 、问题的引入:为什么不用循环?
假设RTOS系统有 64 个优先级(0-63),数值越小优先级越高。我们通常用一个 64 位的变量(或包含 8 个 uint8_t 的数组)来记录任务状态,每一位代表一个优先级任务的状态:1 表示就绪,0 表示未就绪。
最直观的方法是从第 0 位开始向后扫描,直到发现第一个为 1 的位。
最好情况: 第 0 位就是 1,查 1 次。
最坏情况: 只有第 63 位是 1,查 64 次。
这种 O(n) 的算法在实时系统中存在隐患:调度时间不确定(Non-deterministic)。在高频触发的滴答中断中,这种耗时的波动性可能导致任务抖动过大。
后续内容可看网页链接
