一、调度基础:实时系统定义、硬实时与软实时区别、调度算法评价指标

1.1 到底什么是实时系统?

先聊聊实时系统的定义。很多人一听「实时」,就以为是「快」。其实不是。

实时系统的核心,不是算得快,而是在规定时间内必须完成。我习惯这么跟团队讲:你点外卖,30分钟送到,这叫实时。如果第31分钟才到,就算饭还是热的,系统也已经「失败」了。

实时系统,说白了就是时间确定性的系统。它保证任务在截止时间之前完成。至于CPU跑多快,那是另一回事。

核心定义: 实时系统 = 逻辑正确性 + 时间正确性。两者缺一不可。

我在项目中遇到过不少新人,上来就问我:「这个系统延迟只有10微秒,算不算实时?」我通常会反问:「你能保证最坏情况下也是10微秒吗?」如果不能,那就不是实时系统。

1.2 硬实时 vs 软实时:差在哪里?

这个区别,我建议你从「错过截止时间的后果」来理解。

特性 硬实时 软实时
错过截止时间 系统崩溃 / 灾难性后果 性能下降 / 用户体验变差
典型场景 飞行控制、安全气囊、心脏起搏器 视频播放、在线游戏、语音通话
调度策略 必须可调度性验证 尽力而为 + 统计保证
我个人的看法 「要么准时,要么死」 「偶尔卡顿,可以接受」

嗯,这里要注意。硬实时系统里,一次失败都不允许。我当年做汽车电子项目时,一个刹车控制任务的截止时间是5ms。如果超了,哪怕只有一次,测试直接不通过。为什么?因为真实场景下,那一次超时可能就是一场事故。

软实时就不一样了。你看视频偶尔卡一下,顶多骂两句,系统不会崩溃。所以软实时系统的调度,通常允许一定的错过率,比如99.9%的任务在截止时间前完成就行。

我的经验: 判断一个系统是硬实时还是软实时,别光看文档。去问QA团队:「这个任务超时了,你们怎么处理?」如果回答是「重启系统」,那就是硬实时。如果回答是「记录日志,继续跑」,那就是软实时。

1.3 调度算法的评价指标

评价一个调度算法好不好,不能只看「快不快」。我一般从三个维度来看:

1.3.1 可调度性

这是硬实时系统的生死线。可调度性,就是问一个问题:给定一组任务,调度算法能不能保证所有任务都在截止时间前完成?

我记得有一次评审会上,架构师拍胸脯说「我们的调度没问题」。我当场让他算一下可调度性测试。结果一算,CPU利用率已经超过100%了。嗯,这就是典型的「感觉良好,实际崩盘」。

常用的可调度性测试方法:

  • 利用率测试:对于RM调度,如果CPU利用率 ≤ n(2^(1/n) - 1),则可调度
  • 响应时间分析:计算每个任务的最坏情况响应时间,与截止时间比较
  • 模拟验证:跑最坏情况下的任务序列,看是否超时
避坑指南: 我曾经犯过一个错误——只测试了平均情况,没测最坏情况。结果系统上线后,在极端负载下频繁超时。从那以后,我要求团队必须做「最坏情况响应时间分析」,哪怕多花一倍测试时间。

1.3.2 响应时间

响应时间,指的是从任务被触发到任务完成的时间。这里面有个关键点:最坏情况响应时间比平均响应时间重要得多。

你想想看,在实时系统里,平均响应时间再好看,如果最坏情况超时了,那也没用。我习惯用这个公式:

响应时间 = 任务执行时间 + 调度延迟 + 抢占延迟 + 资源等待时间

其中,抢占延迟是最容易被忽略的。我在一个项目中遇到过,任务本身只跑2ms,但因为被高优先级任务频繁抢占,实际响应时间达到了15ms。这就是典型的「执行时间短,响应时间长」。

1.3.3 吞吐量

吞吐量,就是单位时间内系统能完成的任务数量。这个指标在软实时系统中更重要。

举个例子:一个视频解码系统,每秒需要处理30帧。如果吞吐量能达到35帧/秒,那系统就绰绰有余。但如果只有25帧/秒,那就会卡顿。

吞吐量和响应时间,其实是一对矛盾。我个人的经验是:

  • 硬实时系统:优先保证响应时间,吞吐量够用就行
  • 软实时系统:在保证一定响应时间的前提下,尽量提高吞吐量

1.4 知识体系总览

下面这张图,是我梳理的本章知识结构。你可以把它当作一个「地图」,后面几章都会围绕这些核心概念展开。

实时任务调度基础 · 知识体系 实时系统定义 时间确定性 + 逻辑正确性 硬实时 vs 软实时 错过截止时间的后果不同 调度算法评价指标 三个核心维度 硬实时:灾难性后果 软实时:性能下降 硬实时:必须可调度性验证 软实时:统计保证 可调度性:能否保证完成 响应时间:最坏情况分析 吞吐量:单位时间任务数 核心思想:时间确定性是实时系统的灵魂 评价一个调度算法,先看可调度性,再看响应时间,最后看吞吐量

1.5 本章小结

这一章,我们聊了三个核心概念:

  • 实时系统:不是快,而是准时。逻辑正确 + 时间正确,缺一不可。
  • 硬实时 vs 软实时:区别在于错过截止时间的后果。硬实时是「要么准时,要么死」,软实时是「偶尔卡顿,可以接受」。
  • 三个评价指标:可调度性(能不能跑)、响应时间(跑得快不快)、吞吐量(跑得多不多)。

我个人建议,你在开始设计调度算法之前,先把这三个概念吃透。尤其是可调度性,这是硬实时系统的命门。我见过太多项目,前期不重视可调度性分析,后期上线才发现任务跑不完,最后只能降频、砍功能,得不偿失。

一个小技巧: 下次你拿到一个实时系统需求,先问三个问题:
1. 任务错过截止时间会怎样?(判断硬/软实时)
2. 最坏情况下CPU利用率是多少?(判断可调度性)
3. 响应时间要求是多少?(确定调度策略)

公众号:蓝海资料掘金营,微信deep3321