第三章 任务管理与调度


文档摘要

第三章 · 任务管理与调度 本章要回答的三个问题:优先级到底该怎么定,有没有可计算的方法而不是拍脑袋?调度器在每个时刻具体在做什么,凭什么保证高优先级任务总是先跑?一次任务切换到底花多少时间,时间都花在哪几个动作上? 为什么会有这一章 调度是 RTOS 的心脏,也是最多人「用过但没懂」的部分。多数开发者会创建任务、会设优先级,但说不出三个问题:为什么这套系统敢承诺截止期、切换一次的代价是多少、优先级设高了或设低了分别会怎样。后果是两类典型事故:优先级全设成一样导致调度器退化成先来先服务;或者为了「让采样快一点」把采样任务抬到最高,反而饿死了看门狗喂狗任务,系统被周期性复位。 本章按「建模—决策—执行」三步走:3.1 节定义任务与它的生命周期,这是调度的对象;3.

第三章 · 任务管理与调度

本章要回答的三个问题:优先级到底该怎么定,有没有可计算的方法而不是拍脑袋?调度器在每个时刻具体在做什么,凭什么保证高优先级任务总是先跑?一次任务切换到底花多少时间,时间都花在哪几个动作上?

为什么会有这一章

调度是 RTOS 的心脏,也是最多人「用过但没懂」的部分。多数开发者会创建任务、会设优先级,但说不出三个问题:为什么这套系统敢承诺截止期、切换一次的代价是多少、优先级设高了或设低了分别会怎样。后果是两类典型事故:优先级全设成一样导致调度器退化成先来先服务;或者为了「让采样快一点」把采样任务抬到最高,反而饿死了看门狗喂狗任务,系统被周期性复位。

本章按「建模—决策—执行」三步走:3.1 节定义任务与它的生命周期,这是调度的对象;3.2 节讲调度算法与可行性分析,这是决策逻辑,也是全书数学最密的一节;3.3 节拆开上下文切换,把执行代价算成周期数。读完这三节,第一章立下的「截止期防守」就有了完整的攻防手册。

读完能解决什么

  • 用任务四要素(函数、栈、优先级、参数)正确建模一个并发需求,并为它选对周期性或事件驱动形态;
  • 按速率单调原则分配优先级,并用利用率判据快速判断任务集是否可调度;
  • 用响应时间迭代公式核验关键任务的截止期,而不是只靠实测「感觉没超」;
  • 说出一次上下文切换的动作序列与典型周期开销,识别哪些编码习惯在无谓地增加切换次数;
  • 解释优先级反转的发生条件,并为第四章的互斥量话题做好铺垫。

各节怎么分工

节号 回答的问题 关键产出
3.1 任务模型与状态机 任务是什么,有哪些状态,如何创建与删除 状态机图、TCB 与栈的布局、创建代码
3.2 调度算法与策略 谁先运行,如何证明都能按期完成 优先级分配规则、利用率判据、响应时间分析
3.3 上下文切换与开销优化 切换的动作序列与代价,如何减少切换 切换时序标注图与切换开销的构成清单

先立对象模型,再讲决策算法,最后算执行代价——顺序不可换,因为后两节都建立在 3.1 的状态定义上。

先决条件

第二章的两个结构(TCB、就绪表)必须先掌握;1.1 节的截止期与 WCET 定义会在 3.2 节大量使用。数学只需要初中水平的求和与取整。

本章全景图

任务生命周期构成一个封闭状态机,调度的全部工作就是把任务在「就绪、运行、阻塞」三个态之间搬运,搬运规则下节展开:

读这张图有两个入口:从「运行态到阻塞态」出去的箭头是任务自愿让出处理器,延迟可控;从「运行态到就绪态」的箭头是被迫让出,它的时机由别人决定——实时性分析的重点正是这条被迫箭头多久发生一次。

往下走到哪

调度解决「谁用处理器」,但任务之间的协作还得靠同步与通信原语:两个任务共抢一个外设时怎么排队、一个中断怎么把数据安全地递给任务。这些是第四章的内容,而 3.2 节埋下的优先级反转问题,将在 4.3 节得到正面回答。

调度学习的方法建议

调度是全书数学最密的一章,也是最容易「看懂了但不会用」的一章,这里给三条学习方法。第一,每个公式配一个自己的任务集:把手上项目的真实参数(周期、执行时间)代入利用率判据与迭代公式,算出结果再去仪器上实测,数学与测量的差距会教你认识 WCET 估计的误差来源。第二,状态机要配上时间标注:单独的状态迁移图是定性的,把每个迁移的触发频率标上去,它就变成定量分析的第一手材料。第三,切莫死记算法结论,抓住「优先级是为了谁、抢占代价是什么、阻塞时间从哪来」三个主轴,所有变体都能现场推导。

自查两问:把一个任务集的周期整体减半,利用率判据的结果会怎么变?某任务的截止期比周期短,优先级该怎么排?这两问背后分别是判据的尺度无关性与截止期单调规则——答不出说明还停在记忆层,回 3.2 节再走一遍算例。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U