RT的最终目的是尽可能多的让原来系統不可抢占的部分变成可抢占,让高优先级的程序先跑。这里的rt引入了一个deadline的说法,此时的实时性是保证在最大一个时间间隔内,程序被执行。比如每100ms算法做一次决策。
所以此时面临着几座大山,需要击破普通内核的基石和底线。
首先是中断上下文和进程上下文的隔离。中断上下文有硬中断和软中断,且其优先级是高于进程上下文的,你的应用程序在中断老大哥面前请靠边站。所以现在中断线程化,统统都变成[irq/n-xxx][ksoftirqd/n],跟进程一起调度,打掉保护伞,大家一起抢资源。
其次是各种锁。锁分为挂起休眠锁,和自旋忙等锁。这个自旋锁系列为了kiss,会关抢占/中断。而且内核里面用的茫茫多,就遍地都是不可抢占的堡垒。所以现在rt,除了raw_spinlock,直接大部分給替换成rt_mutex,这样堡垒就都被拔除了。however,虽然rt_mutex自己維护调用链,引入PI(priority inheritance),用来解决优先级反转的问题,看似美好的结局,但是留下其他问题。rcu这种无锁机制倒霉蛋成了最大的受害者。还有一些异步通知的机制也没有锁owner的说法,所以就不能放到锁的调用链里面,没法进行PI处理。所以就一不小心就饿死咯,官方文档提了下超时提优先级的方案,但实际上然并卵。
其他还有就是增加高精度timer,和干掉系统tick中断。
rt这种打碎内核基石的方法,使得app成为了脱缰的野马,必须要更强有力的缰绳来拉住。rt throttle诞生,这个机制只是提醒你爆核了,最终还是要靠精细的软件调整和资源分配调度,让资源使用如丝般顺滑。