Linux PREEMPT_RT 实时内核图解一
1. 什么叫实时(Real-Time)
“实时 ≠ 快”,而是“可预测、可保证”。
实时系统关注的是“最坏情况是否可控”。
2. Linux 为什么不实时?
Linux 中导致实时性下降的核心原因,包括:
- 中断关闭(IRQ Disable)
- 自旋锁(Spinlock)
- SoftIRQ
- 调度延迟
- 内核后台活动
普通 Linux 更关注吞吐量与通用性,因此会产生不可预测延迟。
3. 实时 vs 非实时
实时系统与普通系统的设计是有目标差异的:
- 非实时系统关注平均性能与吞吐量
- 实时系统关注 Worst-Case Latency 与确定性
4. 什么叫抢占(Preemption)
操作系统中的“抢占”概念,即:高优先级任务是否能够立即打断当前任务运行。
5. Linux 抢占模型演进
Linux抢占模型的发展过程:
- PREEMPT_NONE
- PREEMPT_VOLUNTARY
- PREEMPT
- PREEMPT_RT
Linux 是一步步增强内核抢占能力,从而降低延迟并提升实时性。
6. 内核态为什么难抢占?
Linux 内核中“不可抢占区”的来源,包括:
- spinlock
- preempt_disable
- local_irq_disable
- critical section
内核为了保证数据一致性,需要暂时禁止抢占,而这正是实时性优化的核心难点。
7. Linux 中断流程
Linux 中断处理路径:
硬件中断→IRQ Handler→SoftIRQ→ksoftirqd→用户进程
8. 为什么中断影响实时性?
中断为何会成为实时系统中的“延迟来源”呢?
- 中断具有高优先级
- 中断期间 CPU 无法执行实时任务
- 长时间中断会导致 jitter 与 deadline miss
9. IRQ 线程化(PREEMPT_RT 核心)
PREEMPT_RT 中最关键的机制之一:
IRQ Threading
即将原本运行在硬中断上下文中的处理逻辑,迁移到可调度、可抢占的内核线程中执行。
该机制显著降低了:
- 中断阻塞时间
- 实时任务等待时间
- 系统抖动(Jitter)
10. softirq 实时化
PREEMPT_RT 对 SoftIRQ 进行了优化
普通 Linux 中:
- softirq 在不可抢占上下文执行
PREEMPT_RT 中:
- softirq 交由 ksoftirqd 内核线程处理
- 可以被高优先级任务抢占
从而提升网络、大量 I/O 场景下的实时性能。