实时Linux编程:内核锁、定时器与延迟测量
1. 可抢占内核锁
在实时Linux内核中,可抢占内核锁是一项重要的改进。PREEMPT_RT 对内核锁进行了重大修改,使大多数内核锁变为可抢占的,不过这部分代码尚未纳入主线内核。
1.1 自旋锁问题
自旋锁是内核中常用的锁机制,它是一种忙等待互斥锁,在竞争情况下无需上下文切换,只要锁的持有时间较短,效率就非常高。理想情况下,自旋锁的锁定时间应小于两次重新调度所需的时间。
然而,持有自旋锁的线程不能被抢占,因为抢占可能导致新线程进入相同代码,在尝试锁定同一自旋锁时发生死锁。因此,在主线 Linux 中,锁定自旋锁会禁用内核抢占,创建一个原子上下文,这可能导致低优先级线程持有自旋锁时阻止高优先级线程调度,即优先级反转问题。
1.2 PREEMPT_RT 的解决方案
PREEMPT_RT 采用的解决方案是将几乎所有自旋锁替换为 RT - mutexes。互斥锁虽然比自旋锁慢,但它是完全可抢占的,并且实现了优先级继承,因此不会出现优先级反转问题。
2. 获取 PREEMPT_RT 补丁
RT 开发者不会为每个内核版本创建补丁集,平均每两个内核版本创建一次补丁。目前支持的最新内核版本如下:
- 5.10 - rt
- 5.9 - rt
- 5.6 - rt
- 5.4 - rt
- 5.2 - rt
- 5.0 - rt
- 4.19 - rt
- 4.18 - rt
- 4.16 - rt
- 4.14 - rt
- 4.