实时编程:优化Linux系统的实时性能
1. 实时编程中的延迟类型
在实时编程中,有几种关键的延迟类型需要我们关注,它们会影响系统的实时性能。
-中断延迟(Interrupt Latency):指的是从发生中断到中断服务程序(ISR)处理完中断并唤醒等待该事件的线程所花费的时间。它主要取决于ISR的编写方式,通常应该在微秒级别。
-抢占延迟(Preemption Latency):是从内核得知一个线程准备好运行到调度器实际运行该线程的时间。这取决于内核是否可被抢占。如果内核正在执行临界区代码,重新调度就必须等待,延迟时间取决于内核抢占的配置。
2. 内核抢占设置
主流Linux内核有三种抢占设置,可以通过“Kernel Features | Preemption Model”菜单进行选择:
| 配置选项 | 描述 | 特点 |
| — | — | — |
| CONFIG_PREEMPT_NONE | 无抢占 | 内核代码会持续运行,直到通过系统调用返回用户空间或者遇到使当前线程休眠的等待操作。这种设置减少了内核与用户空间之间的转换次数和上下文切换总数,能实现最高吞吐量,但会导致较大的抢占延迟。适用于对吞吐量要求高于响应性的服务器和部分桌面内核。 |
| CONFIG_PREEMPT_VOLUNTARY | 启用额外的抢占请求检查 | 当need_resched标志被设置时,调度器会被调用,这减少了最坏情况下的抢占延迟,但会使吞吐量略有降低。一些桌面发行版会采用此设置。 |
| CONFIG