在学习实时操作系统(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调度

实时操作系统

任务切换

 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐