嵌入式Linux实时性能优化与测量
1. 可抢占内核锁
在实时系统中,内核锁的可抢占性是一个关键问题。PREEMPT_RT对内核锁进行了重大修改,使大多数内核锁可被抢占,但这部分代码尚未合并到主线内核中。
自旋锁是内核中常用的锁机制,它是一种忙等待互斥锁,在竞争情况下无需上下文切换,只要锁的持有时间较短,效率就很高。理想情况下,自旋锁的持有时间应小于两次重新调度所需的时间。然而,持有自旋锁的线程不能被抢占,否则可能导致新线程进入相同代码并在尝试锁定同一自旋锁时发生死锁。因此,在主线Linux中,锁定自旋锁会禁用内核抢占,创建一个原子上下文,这可能导致低优先级线程持有自旋锁时阻止高优先级线程被调度。
PREEMPT_RT采用的解决方案是将几乎所有自旋锁替换为RT互斥锁。虽然互斥锁比自旋锁慢,但它是完全可抢占的,并且实现了优先级继承,不会出现优先级反转问题。
2. 获取PREEMPT_RT补丁
RT开发者不会为每个内核版本创建补丁集,平均每两个内核版本创建一次补丁。目前支持的最新内核版本如下:
- 4.9-rt
- 4.8-rt
- 4.6-rt
- 4.4-rt
- 4.1-rt
- 4.0-rt
- 3.18-rt
- 3.14-rt
- 3.12-rt
- 3.10-rt
- 3.4-rt
- 3.2-rt
补丁可从https://www.kernel.org/pub/linux/kernel/projects/rt获取。如果你使用的是Yocto Project,已经有内核的rt版本。否则,你获取