最近在開發過程中,遇到一個問題線程優先級翻轉的問題。那什么原因導致優先級翻轉呢?
在RTOS開發中,優先級翻轉問題也是值得我們去關注留意的。避免代碼癱瘓。
什么是優先級翻轉
所謂的優先級翻轉問題:即當一個高優先級線程通過信號量機制訪問共享資源時,該型號量以被一個低優先級線程占有,而這個低優先級的任務在訪問共享資源時可能又被一個中等優先級任務搶占。從上面的描述,高優先級線程被許多較低優先級的任務阻塞,導致高優先級的實時性得不到保證。
舉例:有三個線程分別為:A、B、C。優先級A 》 B 》 C,線程A和B處于掛起狀態,等待某一事件發生,線程C正在運行,此時任務C開始使用共享資源Source。在使用Source時,線程A等待事件到來,線程A轉為就緒態,因為線程A優先級比線程C高,所以線程A會立即執行。當線程A要使用共享資源Source時,由于共享資源Source正在被線程C使用,因此線程A被掛起,線程C開始運行。如果此時中等優先級線程B等待事件到來,則線程B轉為就緒態。由于線程B優先級比線程C高,因此線程B開始運行,直到其運行完畢,線程C才開始運行。直到線程C釋放共享資源Source后,線程A才得以執行。在這種情況下,優先級發生了翻轉,線程B先于線程A運行。
如何解決優先級翻轉
解決優先級翻轉的方法:優先級天花板、優先級繼承。那么這兩種方法有什么?
優先級天花板優先級天花板是當線程申請某資源時,把該線程的優先級提升到可訪問這個資源的所有線程中的最高優先級,這個優先級稱為該資源的優先級天花板。這種方法簡單易行,不必進行復雜的判斷,不管線程是否阻塞了高優先級線程的運行, 只要線程訪問共享資源都會提升線程的優先級。
優先級繼承優先級繼承是當線程A申請共享資源Source時,如果共享資源Source正在被線程C使用,通過比較線程C與自身的優先級,如發現線程C的優先級小于自身的優先級, 則將線程C的優先級提升到自身的優先級,線程C釋放資源Source后,再恢復線程C的原優先級。這種方法只在占有資源的低優先級線程阻塞了高優先級線程時才動態的改變線程的優先級。
RT-Thread是如何解決線程優先級翻轉呢?
在官方的文檔中,對線程優先級翻轉有相對應的說明及解決方法。下面我把RT-THREAD官方的描述及解決方法貼出來。
使用信號量會導致的另一個潛在問題是線程優先級翻轉問題。所謂優先級翻轉,即當一個高優先級線程試圖通過信號量機制訪問共享資源時,如果該信號量已被一低優先級線程持有,而這個低優先級線程在運行過程中可能又被其它一些中等優先級的線程搶占,因此造成高優先級線程被許多具有較低優先級的線程阻塞,實時性難以得到保證。如下圖所示:有優先級為 A、B 和 C 的三個線程,優先級 A 》 B 》 C。線程 A,B 處于掛起狀態,等待某一事件觸發,線程 C 正在運行,此時線程 C 開始使用某一共享資源 M。在使用過程中,線程 A 等待的事件到來,線程 A 轉為就緒態,因為它比線程 C 優先級高,所以立即執行。但是當線程 A 要使用共享資源 M 時,由于其正在被線程 C 使用,因此線程 A 被掛起切換到線程 C 運行。如果此時線程 B 等待的事件到來,則線程 B 轉為就緒態。由于線程 B 的優先級比線程 C 高,因此線程 B 開始運行,直到其運行完畢,線程 C 才開始運行。只有當線程 C 釋放共享資源 M 后,線程 A 才得以執行。在這種情況下,優先級發生了翻轉:線程 B 先于線程 A 運行。這樣便不能保證高優先級線程的響應時間。
在 RT-Thread 操作系統中,互斥量可以解決優先級翻轉問題,實現的是優先級繼承算法。優先級繼承是通過在線程 A 嘗試獲取共享資源而被掛起的期間內,將線程 C 的優先級提升到線程 A 的優先級別,從而解決優先級翻轉引起的問題。這樣能夠防止 C(間接地防止 A)被 B 搶占,如下圖所示。優先級繼承是指,提高某個占有某種資源的低優先級線程的優先級,使之與所有等待該資源的線程中優先級最高的那個線程的優先級相等,然后執行,而當這個低優先級線程釋放該資源時,優先級重新回到初始設定。因此,繼承優先級的線程避免了系統資源被任何中間優先級的線程搶占。
說明
對于我們開發來說,要避免發生優先級翻轉的問題。
優先級翻轉的危害:
任務調度時,時間不確定性,破壞實時系統的實時性,嚴重時可能導致系統崩潰。
優先級低的任務比優先級高的任務更先執行,導致任務的錯亂,邏輯的錯亂。
原文標題:線程優先級翻轉,如何避免?
文章出處:【微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
嵌入式
+關注
關注
5087文章
19145瀏覽量
306120 -
RTOS
+關注
關注
22文章
817瀏覽量
119717
原文標題:線程優先級翻轉,如何避免?
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論