汽车刹车、飞机飞控、工业机器人——这些场景需要确定性响应,通用 OS 无法保证。
一、先看图
flowchart TD
RT[实时需求] --> HARD[硬实时<br/>截止时间必须满足]
RT --> SOFT[软实时<br/>偶尔超时可接受]
HARD --> VX[VxWorks<br/>航空/国防]
HARD --> QNX_R[QNX<br/>汽车/医疗]
SOFT --> ZEPHYR[Zephyr<br/>IoT]
SOFT --> PREEMPT[Linux PREEMPT_RT<br/>通用+软实时]
classDef hard fill:#f8514922,stroke:#f85149,color:#adbac7;
classDef soft fill:#f0883e22,stroke:#f0883e,color:#adbac7;
class HARD,VX,QNX_R hard
class SOFT,ZEPHYR,PREEMPT soft
二、硬实时 vs 软实时
| 类型 | 定义 | 例子 |
|---|---|---|
| 硬实时 | 错过截止时间 = 系统失败 | ABS 制动、心脏起搏器 |
| 软实时 | 偶尔超时可降级 | 视频播放、VoIP |
| 固定实时 | 超时的结果没有价值但不灾难 | 金融交易 |
三、VxWorks
Wind River 的商业 RTOS:
- 微内核架构
- 确定性调度(优先级抢占 + 时间片)
- DO-178C 认证(航空)
- 内存保护可选
- 支持 POSIX 子集
四、QNX
BlackBerry 的微内核 RTOS:
- 真正的微内核 → 驱动和文件系统在用户态
- 消息传递 IPC
- POSIX 兼容度高
- 汽车仪表盘、ADAS
- ISO 26262(汽车功能安全)
五、Zephyr
Linux Foundation 的开源 RTOS:
void main(void)
{
k_thread_create(&my_thread, stack, STACK_SIZE,
my_entry, NULL, NULL, NULL,
PRIORITY, 0, K_NO_WAIT);
}- 极小内存(最低 8KB RAM)
- 支持 300+ 开发板
- 设备树支持
- LTS 版本(2 年支持)
六、PREEMPT_RT
Linux 实时补丁:
# 内核配置
CONFIG_PREEMPT_RT=y关键改变:
| 机制 | 标准 Linux | PREEMPT_RT |
|---|---|---|
| spinlock | 禁用抢占 | 变为 rt_mutex(可抢占) |
| softirq | 中断上下文 | 线程化 |
| 中断处理 | 硬中断 | 线程化中断 |
| 调度延迟 | ~ms | ~10-50μs |
6.1 已合入主线
从 Linux 6.12 开始 → PREEMPT_RT 完全合入主线。
七、ARINC-653
航空电子分区调度:
时间窗口 1 → 分区 A(飞控)
时间窗口 2 → 分区 B(导航)
时间窗口 3 → 分区 C(娱乐)
分区之间时间和空间完全隔离 → 一个分区 crash 不影响其他。
八、安全认证
| 标准 | 领域 | RTOS |
|---|---|---|
| DO-178C | 航空 | VxWorks |
| ISO 26262 | 汽车 | QNX, FreeRTOS |
| IEC 62304 | 医疗 | VxWorks, QNX |
| IEC 61508 | 工业 | VxWorks, SAFERTOS |
认证需要源码可追溯、100% 代码覆盖、形式化方法。
九、对比总结
| 方面 | VxWorks | QNX | Zephyr | PREEMPT_RT |
|---|---|---|---|---|
| 架构 | 微内核 | 微内核 | 单体 | 宏内核 |
| 确定性 | 极高 | 极高 | 高 | 中-高 |
| 生态 | 小 | 中 | 增长中 | Linux 全生态 |
| 成本 | 商业 | 商业 | 开源 | 开源 |
| 内存 | ~100KB | ~1MB | ~8KB | ~GB |
十、小结
- 硬实时需要确定性 → VxWorks/QNX 是传统选择
- Zephyr 是 IoT 领域的新兴开源 RTOS
- PREEMPT_RT 让 Linux 获得软实时能力
- 安全认证是 RTOS 的关键差异化
- 选择取决于确定性要求、生态需求、认证需求
参考文献
- Wind River, “VxWorks Programmer’s Guide.”
- QNX Neutrino RTOS documentation
- Zephyr Project documentation (zephyrproject.org)
- Steven Rostedt, “PREEMPT_RT.” LWN
工具
- Zephyr west
- PREEMPT_RT patch
- cyclictest
上一篇:Windows 内核 下一篇:Unikernel
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【操作系统百科】线程化中断
把 IRQ handler 线程化——PREEMPT_RT 的核心改造之一。本文讲 request_threaded_irq、handler/thread_fn 分工、IRQF_ONESHOT、全线程化的延迟与吞吐代价、softirq 线程化趋势。
【操作系统百科】优先级反转与继承
火星探路者号因优先级反转重启——这是实时系统最经典的故事。本文讲优先级反转现象、PIP 优先级继承协议、PCP 优先级天花板、rt_mutex、PREEMPT_RT 的 spinlock 转换、DEADLINE 任务反转。
【操作系统百科】SCHED_FIFO/RR 与 PREEMPT_RT
Linux 里的实时:SCHED_FIFO/RR 提供优先级调度,但原版内核仍有不可抢占点。PREEMPT_RT 补丁集 20 年后(6.12)合入主线,把几乎所有 spinlock 变 rt_mutex、IRQ 变线程。本文讲 RT 调度语义、RT-throttling、cyclictest 基线、优先级继承、以及 RT 部署的陷阱。
【操作系统百科】内存回收
Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。