调度算法:CPU 到底该交给哪个任务?
前面两章,我们先是建立了任务控制块(TCB)这个静态档案,又理清了任务状态切换的动态轨迹。现在,最核心的问题摆在了眼前:当多个任务同时处于就绪态,CPU 这个单核资源到底应该分配给谁?这个决策过程,就是调度算法的职责。
如果调度器是 RTOS 的“大脑”,那么调度算法就是大脑的“决策逻辑”。它直接决定了系统的实时性、公平性和吞吐量。本章我们聚焦最经典、在实际工程中应用最广的两种策略:优先级抢占调度和时间片轮转调度。
1.优先级抢占调度:紧急事件永远优先
优先级抢占调度(Preemptive Priority Scheduling)是实时操作系统区别于通用操作系统的最核心特征。它的规则非常简单:当一个高优先级任务就绪时,立刻暂停当前正在运行的低优先级任务,将 CPU 控制权交给高优先级任务。
我们通过一个具体的场景来体会。假设系统中有三个任务:
-
任务A(传感器采集):优先级中等(Prio=2),每隔100ms运行一次,每次耗时约5ms。
-
任务B(LED闪烁):优先级最低(Prio=1),周期性翻转LED,耗时极短。
-
任务C(紧急按钮):优先级最高(Prio=3),等待外部中断,一旦触发立即执行。
下面的时序图展示了优先级抢占调度的典型运行过程:

在时刻 15,紧急按钮中断触发,任务C进入就绪态。调度器比较任务C和当前正在运行的任务A的优先级,发现3>2,立刻将任务A挂起,把CPU交给任务C。任务C执行完后,任务A才从被中断的地方继续运行。而可怜的LED任务B,只能在所有高优先级任务都空闲时,才能得到一丝运行机会。
这种机制的最大优点就是实时性:高优先级任务的响应时间是确定的、可预测的。因此,它非常适合物联网设备中那些需要快速响应的场景,比如火灾报警传感器检测到烟雾后必须立即上报云端,不能有任何延迟。
在华为LiteOS内核中,优先级抢占是默认的调度策略。LiteOS支持最多32个优先级(0 为最高),每个任务在创建时通过tskInitParam.usTaskPrio字段设定自己的优先级。调度器始终选择就绪链表中优先级最高的任务运行,完美体现了抢占调度的思想。
2.时间片轮转调度:同优先级下的公平分配
优先级抢占解决了紧急程度的问题,但带来一个新问题:如果有多个同等优先级的任务同时就绪,谁先运行?如果仍然单纯按顺序执行,那么排在前面的任务可能会长期霸占CPU,后面的任务迟迟得不到机会。
这就引入了时间片轮转调度(Round‑Robin Scheduling)。它专门用于解决同优先级任务的公平性问题。规则同样简单:所有同优先级的就绪任务,轮流使用CPU,每个任务每次最多运行一个固定的时间片(Time Slice)。
我们用时序图来看一个例子。任务A和任务B都是优先级2,时间片设为5个系统节拍:

任务A先运行了5个节拍后,时间片耗尽,调度器强行把A切换出去,把CPU交给任务B。B也运行5个节拍后,再切换回A。如此往复,两个任务虽然优先级相同,却都能获得均等的执行机会。
在 LiteOS 中,时间片轮转是优先级抢占策略的补充。LiteOS允许配置LOSCFG_BASE_CORE_TIMESLICE宏开关来启用时间片,并且支持为每个任务设置独立的时间片长度。内核的SysTick中断处理函数会在每个系统节拍到来时,递减当前任务的时间片计数器;一旦计数器归零,就触发任务切换,把同优先级链表中的下一个任务推上运行态。
这种“抢占+轮转”的组合策略,既保证了高优先级任务的实时性,也避免了同优先级任务间的饥饿问题,是一种非常均衡的设计。
3.混合调度策略的工程权衡
在实际的嵌入式系统中,几乎没有RTOS会只用一种调度策略。最常见也最成熟的做法就是混合使用优先级抢占和时间片轮转:
-
不同优先级之间的任务:严格按优先级抢占,高优先级就绪立刻抢占低优先级。
-
相同优先级之间的任务:按时间片轮转,公平分配CPU。
这种组合兼顾了实时性和公平性,是当前主流RTOS(包括FreeRTOS、LiteOS、RT-Thread)的默认配置。
然而,这种混合策略也带来了一些需要警惕的副作用。最著名的就是优先级反转(Priority Inversion)问题。简单来说,当一个高优先级任务在等待某个被低优先级任务占用的共享资源(如信号量保护的I²C总线)时,如果中间存在一个中等优先级的任务不断打断低优先级任务,高优先级任务就可能被无限期阻塞,完全破坏了实时性。
解决优先级反转的经典方法是优先级继承。LiteOS 的内核支持互斥锁(Mutex)的优先级继承机制:当高优先级任务请求一个被低优先级任务持有的互斥锁时,内核会临时将低优先级任务的优先级提升到与高优先级任务相同,直到锁被释放,以防止中等优先级任务的干扰。这个细节我们在后续的同步与通信章节中会详细展开。
4.从调度算法看物联网设备的“云边协同”
理解调度算法,不仅仅是为了写出能跑的操作系统内核。在华为云IoT的“云边协同”架构中,边缘设备(比如一个工业网关)上往往同时部署着多个应用进程:
-
实时控制任务(高优先级):负责毫秒级的电机启停或阀门开关,必须以抢占方式保证实时性。
-
数据采集任务(中优先级):周期性读取传感器并存入本地缓存,时间片轮转保证多个传感器通道的公平采样。
-
云通信任务(低优先级):在CPU空闲时,将缓存数据打包通过MQTT上传到华为云IoT平台。
这三类任务在同一个MCU上和谐共处,正是依赖了优先级抢占和时间片轮转的混合调度。高优先级的控制任务绝不会因为云通信的阻塞而被延迟;而云通信任务也总能在系统闲暇时获得执行机会,保证数据不丢失。这正是嵌入式RTOS赋予边缘设备的“多任务并行”能力,也是华为云倡导的“端侧智能”的基础。
5.小结与下节预告
本章我们揭开了调度算法的面纱:优先级抢占保证了高优先级任务的实时响应,时间片轮转保证了同优先级任务的公平分配,而两者的混合则成为工业级RTOS的事实标准。理解这两种策略,你就理解了调度器在做决策时的底层逻辑。
然而,还有一个问题我们没有回答:当调度器决定从任务A切换到任务B时,CPU内部到底发生了哪些魔法? 程序计数器、堆栈指针、通用寄存器……这一切如何在短短几个微秒内完成“现在”的保存和“未来”的恢复?这就是下一章要硬核拆解的——上下文切换。届时,我们将深入到ARM汇编指令层面,亲手掀开这一层神秘的面纱。
- 点赞
- 收藏
- 关注作者
评论(0)