协作式调度和抢占式调度有什么区别?一文理解 RTOS 核心调度机制
在学习实时操作系统(RTOS)时,调度方式是最核心的概念之一。
很多初学者第一次接触 RTOS 时都会遇到一个问题:
为什么有的系统使用协作式调度,有的系统使用抢占式调度?它们到底有什么区别?
简单来说:
协作式调度:任务主动让出 CPU
抢占式调度:系统强制切换任务
两者实现方式不同,也决定了系统实时性、复杂度和应用场景。
一、什么是任务调度?
在单片机系统中,CPU 同一时间只能执行一个任务。
例如:
任务A:采集传感器数据
任务B:控制电机
任务C:处理通信协议
如果没有调度机制,通常只能:
while(1)
{
task_a();
task_b();
task_c();
}
这种方式简单,但是随着项目复杂度增加,会出现:
某个任务执行时间过长
无法保证实时响应
代码越来越难维护
RTOS 的作用就是管理多个任务,让 CPU 按照规则运行不同任务。
这个规则,就是调度算法。
二、协作式调度(Cooperative Scheduling)
协作式调度的核心:
任务自己决定什么时候释放 CPU。
也就是说,系统不会主动打断正在运行的任务。
例如:
void task1(void)
{
while(1)
{
do_work();
os_yield();
}
}
任务执行完成后,通过:
延时
等待事件
主动让出 CPU
通知系统:
“我暂时不用 CPU 了,可以运行其他任务。”
协作式调度的特点
1. 实现简单
因为系统不需要随时打断任务。
任务切换通常只发生在:
主动退出
主动延时
主动等待
所以内核代码非常简单。
2. 上下文切换少
任务什么时候切换,由任务自己控制。
因此:
调度开销低
系统资源占用小
对于资源有限的 MCU 很友好。
3. 实时性依赖任务设计
缺点也很明显。
如果一个任务:
while(1)
{
calculate();
}
一直占用 CPU,不主动让出。
那么其他任务就无法运行。
所以协作式系统要求:
每个任务必须具有良好的合作意识。
三、抢占式调度(Preemptive Scheduling)
抢占式调度的核心:
操作系统可以主动暂停当前任务,运行更加重要的任务。
例如:
当前正在执行普通任务:
Task A
突然发生:
高优先级任务 Task B 就绪
系统立即:
保存 Task A 上下文
切换到 Task B
执行 Task B
Task B 完成后:
恢复 Task A
抢占式调度过程
简单表示:
任务A运行
↓
高优先级任务到达
↓
保存任务A现场
↓
切换任务B
↓
任务B执行
↓
恢复任务A继续运行
抢占式调度的特点
1. 实时性更强
高优先级任务可以立即响应。
例如:
电机保护
通信接收
紧急控制
这些任务不能等待其他任务完成。
2. 系统复杂度更高
因为系统需要处理:
上下文保存
上下文恢复
临界区保护
优先级管理
任务同步
内核设计难度明显增加。
3. 对程序要求降低
即使某个任务运行时间较长。
只要没有关闭中断或者进入临界状态。
系统仍然可以切换任务。
四、两种调度方式对比
|
对比项目 |
||
|
协作式调度抢占式调度任务切换方式 |
||
|
主动让出系统强制切换实时性 |
||
|
一般高实现难度 |
||
|
低高内核复杂度 |
||
|
简单复杂CPU利用率 |
||
|
较高较高资源占用 |
||
|
低较高任务要求 |
||
|
需要主动配合要求较低适合场景 |
简单控制、小型MCU复杂实时系统
五、为什么很多 RTOS 选择抢占式?
随着嵌入式系统越来越复杂:
以前:
按键
LED
定时器
现在:
通信协议
GUI
文件系统
网络
AI算法
多传感器
任务之间的实时要求越来越高。
因此现代 RTOS 通常采用:
优先级调度
抢占式调度
时间片机制
例如很多商业 RTOS 都采用这种方式。
六、协作式调度还有价值吗?
虽然抢占式调度更加流行,但是协作式调度并没有消失
原因是:
1. 学习价值高
协作式调度非常适合理解:
什么是任务
什么是上下文切换
什么是调度器
很多 RTOS 的思想,都可以从协作式开始学习。
2. 小型系统依然适用
对于:
8位 MCU
低功耗设备
简单控制器
协作式调度可能更加合适。
没有必要为了几个简单任务,引入复杂内核。
七、HRTOS中的调度设计
HRTOS 也保留了协作式调度机制(coop扩展模块)。
原因很简单:
协作式调度是理解实时系统最好的入口。
开发者可以先理解:
任务如何切换
调度器如何工作
上下文如何保存
然后再深入:
优先级抢占
高速任务
中断调度
从简单到复杂,更符合学习规律。
八、总结
协作式调度和抢占式调度没有绝对的优劣。
它们解决的是不同问题:
协作式调度:用简单换取低成本。
抢占式调度:用复杂换取更强实时性。
对于学习 RTOS:
推荐先理解协作式调度。
对于复杂工业控制:
通常需要抢占式调度。
理解这两种调度方式,是深入学习任何 RTOS 的第一步。
搜索关键词:
协作式调度
抢占式调度
RTOS调度
实时操作系统
任务切换
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)