1、实时系统概述
1.1 实时系统的定义
实时系统(Real-Time System)是一种计算系统,其正确性不仅取决于计算结果的逻辑正确性,还取决于结果产生的时间。在实时系统中,任务必须在规定的截止时间(Deadline)之前完成,否则系统将视为失效。
与通用操作系统追求“平均响应时间”不同,实时系统关注的是“最坏情况下的响应时间”。实时系统的核心特征包括:
- 时间确定性:系统行为在时间上是可预测的,能够保证任务在指定时间内完成。
- 可调度性:在系统设计阶段,可以通过调度分析验证所有任务是否满足时间约束。
- 优先级驱动:任务按照优先级或时间约束进行调度,高优先级任务优先获得CPU资源。
关键概念: 实时 ≠ 快速。一个实时系统可能运行在较低的时钟频率上,但只要它能保证在截止时间前完成任务,它就是合格的实时系统。相反,一个处理速度极快但无法保证时间确定性的系统,不能称为实时系统。
1.2 实时系统的分类
根据错过截止时间造成的后果严重程度,实时系统分为硬实时和软实时两大类。下表从多个维度对比两者的差异:
| 对比维度 | 硬实时(Hard Real-Time) | 软实时(Soft Real-Time) |
|---|---|---|
| 截止时间约束 | 必须严格满足,不允许错过 | 允许偶尔错过,但需控制频率 |
| 错过后果 | 灾难性后果(人员伤亡、设备损毁) | 性能下降、用户体验受损 |
| 调度算法 | 静态优先级调度(如RM)、EDF | 动态优先级调度、加权公平调度 |
| 典型验证方式 | 形式化可调度性分析 | 统计概率保证 |
| Linux支持 | PREEMPT_RT + SCHED_DEADLINE | SCHED_FIFO / SCHED_RR |
下图展示了硬实时与软实时在时间约束上的本质区别:
1.3 典型应用场景
实时系统广泛应用于对时间确定性要求极高的领域。以下从三个典型场景展开分析:
1.3.1 航空航天
航空航天是硬实时系统的典型代表。飞行控制系统、导航系统、发动机管理系统等关键子系统都必须满足严格的时间约束。
- 飞行控制:传感器采样周期通常为10-50ms,控制律计算必须在采样周期内完成。
- 航电系统:ARINC 653标准定义了分区调度,确保不同安全等级的任务在时间上隔离。
- 卫星姿态控制:姿态调整指令必须在毫秒级时间内响应,否则卫星可能偏离轨道。
下图展示了航空航天实时系统的典型架构:
1.3.2 工业控制
工业控制领域是实时系统最成熟的应用市场。从PLC(可编程逻辑控制器)到DCS(分布式控制系统),实时调度保障了生产过程的稳定与安全。
| 应用场景 | 实时要求 | 典型周期 | 调度策略 |
|---|---|---|---|
| PLC逻辑控制 | 硬实时 | 1-10ms | 循环扫描 + 中断 |
| 运动控制 | 硬实时 | 0.1-1ms | 静态优先级调度 |
| 过程控制 | 软实时 | 100ms-1s | EDF / 优先级调度 |
| 数据采集与监控 | 软实时 | 10-100ms | 轮询 + 事件驱动 |
工业控制案例: 在数控机床中,伺服电机的位置环控制周期通常为50-200μs,速度环控制周期为200-500μs。如果控制周期抖动超过10%,将导致加工精度下降甚至刀具损坏。Linux PREEMPT_RT + SCHED_DEADLINE调度器能够将调度延迟控制在微秒级,满足此类高精度控制需求。
1.3.3 自动驾驶
自动驾驶系统是近年来实时系统最前沿的应用领域。它融合了感知、决策、控制等多个子系统,每个子系统都有严格的时间约束。
- 感知层:摄像头帧率30-60fps,激光雷达10-20Hz,毫米波雷达20-50Hz。所有传感器数据必须在帧间隔内完成处理。
- 决策层:路径规划、行为决策需要在50-100ms内完成,否则车辆无法及时应对突发情况。
- 控制层:转向、制动、加速指令的执行周期通常为10-20ms,且抖动必须小于1ms。
下图展示了自动驾驶系统中的实时任务流:
自动驾驶实时挑战: 在高速行驶场景下(120km/h),车辆每秒钟前进33米。如果感知到决策的端到端延迟超过100ms,车辆将多前行3.3米,这可能是安全与事故的分界线。因此,自动驾驶系统对实时调度的确定性要求极高,Linux内核的SCHED_DEADLINE调度器在此类场景中展现出显著优势。
1.4 实时系统与Linux内核
Linux内核从早期版本开始就支持实时调度,但受限于通用操作系统的设计哲学,其实时性能长期受到质疑。随着PREEMPT_RT补丁集和SCHED_DEADLINE调度器的引入,Linux已经能够满足大多数硬实时场景的需求。
下表总结了Linux内核中与实时调度相关的关键特性:
| 特性 | 引入版本 | 说明 |
|---|---|---|
| SCHED_FIFO | Linux 2.0 | 先入先出实时调度,优先级范围1-99 |
| SCHED_RR | Linux 2.0 | 时间片轮转实时调度,同优先级任务轮流执行 |
| PREEMPT_RT | 主线逐步合入 | 将内核大部分区域变为可抢占,降低调度延迟 |
| SCHED_DEADLINE | Linux 3.14 | 基于EDF(最早截止时间优先)的硬实时调度 |
| CPU隔离 | Linux 2.6 | 通过isolcpus将CPU从通用调度中隔离 |