????????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誕生,這個機制只是提醒你爆核了,最終還是要靠精細的軟件調整和資源分配調度,讓資源使用如絲般順滑。