最近在開發(fā)過程中,遇到一個(gè)問題線程優(yōu)先級(jí)翻轉(zhuǎn)的問題。那什么原因?qū)е聝?yōu)先級(jí)翻轉(zhuǎn)呢?
在RTOS開發(fā)中,優(yōu)先級(jí)翻轉(zhuǎn)問題也是值得我們?nèi)リP(guān)注留意的。避免代碼癱瘓。
什么是優(yōu)先級(jí)翻轉(zhuǎn)
所謂的優(yōu)先級(jí)翻轉(zhuǎn)問題:即當(dāng)一個(gè)高優(yōu)先級(jí)線程通過信號(hào)量機(jī)制訪問共享資源時(shí),該型號(hào)量以被一個(gè)低優(yōu)先級(jí)線程占有,而這個(gè)低優(yōu)先級(jí)的任務(wù)在訪問共享資源時(shí)可能又被一個(gè)中等優(yōu)先級(jí)任務(wù)搶占。從上面的描述,高優(yōu)先級(jí)線程被許多較低優(yōu)先級(jí)的任務(wù)阻塞,導(dǎo)致高優(yōu)先級(jí)的實(shí)時(shí)性得不到保證。
舉例:有三個(gè)線程分別為:A、B、C。優(yōu)先級(jí)A 》 B 》 C,線程A和B處于掛起狀態(tài),等待某一事件發(fā)生,線程C正在運(yùn)行,此時(shí)任務(wù)C開始使用共享資源Source。在使用Source時(shí),線程A等待事件到來,線程A轉(zhuǎn)為就緒態(tài),因?yàn)榫€程A優(yōu)先級(jí)比線程C高,所以線程A會(huì)立即執(zhí)行。當(dāng)線程A要使用共享資源Source時(shí),由于共享資源Source正在被線程C使用,因此線程A被掛起,線程C開始運(yùn)行。如果此時(shí)中等優(yōu)先級(jí)線程B等待事件到來,則線程B轉(zhuǎn)為就緒態(tài)。由于線程B優(yōu)先級(jí)比線程C高,因此線程B開始運(yùn)行,直到其運(yùn)行完畢,線程C才開始運(yùn)行。直到線程C釋放共享資源Source后,線程A才得以執(zhí)行。在這種情況下,優(yōu)先級(jí)發(fā)生了翻轉(zhuǎn),線程B先于線程A運(yùn)行。
如何解決優(yōu)先級(jí)翻轉(zhuǎn)
解決優(yōu)先級(jí)翻轉(zhuǎn)的方法:優(yōu)先級(jí)天花板、優(yōu)先級(jí)繼承。那么這兩種方法有什么?
優(yōu)先級(jí)天花板優(yōu)先級(jí)天花板是當(dāng)線程申請(qǐng)某資源時(shí),把該線程的優(yōu)先級(jí)提升到可訪問這個(gè)資源的所有線程中的最高優(yōu)先級(jí),這個(gè)優(yōu)先級(jí)稱為該資源的優(yōu)先級(jí)天花板。這種方法簡(jiǎn)單易行,不必進(jìn)行復(fù)雜的判斷,不管線程是否阻塞了高優(yōu)先級(jí)線程的運(yùn)行, 只要線程訪問共享資源都會(huì)提升線程的優(yōu)先級(jí)。
優(yōu)先級(jí)繼承優(yōu)先級(jí)繼承是當(dāng)線程A申請(qǐng)共享資源Source時(shí),如果共享資源Source正在被線程C使用,通過比較線程C與自身的優(yōu)先級(jí),如發(fā)現(xiàn)線程C的優(yōu)先級(jí)小于自身的優(yōu)先級(jí), 則將線程C的優(yōu)先級(jí)提升到自身的優(yōu)先級(jí),線程C釋放資源Source后,再恢復(fù)線程C的原優(yōu)先級(jí)。這種方法只在占有資源的低優(yōu)先級(jí)線程阻塞了高優(yōu)先級(jí)線程時(shí)才動(dòng)態(tài)的改變線程的優(yōu)先級(jí)。
RT-Thread是如何解決線程優(yōu)先級(jí)翻轉(zhuǎn)呢?
在官方的文檔中,對(duì)線程優(yōu)先級(jí)翻轉(zhuǎn)有相對(duì)應(yīng)的說明及解決方法。下面我把RT-THREAD官方的描述及解決方法貼出來。
使用信號(hào)量會(huì)導(dǎo)致的另一個(gè)潛在問題是線程優(yōu)先級(jí)翻轉(zhuǎn)問題。所謂優(yōu)先級(jí)翻轉(zhuǎn),即當(dāng)一個(gè)高優(yōu)先級(jí)線程試圖通過信號(hào)量機(jī)制訪問共享資源時(shí),如果該信號(hào)量已被一低優(yōu)先級(jí)線程持有,而這個(gè)低優(yōu)先級(jí)線程在運(yùn)行過程中可能又被其它一些中等優(yōu)先級(jí)的線程搶占,因此造成高優(yōu)先級(jí)線程被許多具有較低優(yōu)先級(jí)的線程阻塞,實(shí)時(shí)性難以得到保證。如下圖所示:有優(yōu)先級(jí)為 A、B 和 C 的三個(gè)線程,優(yōu)先級(jí) A 》 B 》 C。線程 A,B 處于掛起狀態(tài),等待某一事件觸發(fā),線程 C 正在運(yùn)行,此時(shí)線程 C 開始使用某一共享資源 M。在使用過程中,線程 A 等待的事件到來,線程 A 轉(zhuǎn)為就緒態(tài),因?yàn)樗染€程 C 優(yōu)先級(jí)高,所以立即執(zhí)行。但是當(dāng)線程 A 要使用共享資源 M 時(shí),由于其正在被線程 C 使用,因此線程 A 被掛起切換到線程 C 運(yùn)行。如果此時(shí)線程 B 等待的事件到來,則線程 B 轉(zhuǎn)為就緒態(tài)。由于線程 B 的優(yōu)先級(jí)比線程 C 高,因此線程 B 開始運(yùn)行,直到其運(yùn)行完畢,線程 C 才開始運(yùn)行。只有當(dāng)線程 C 釋放共享資源 M 后,線程 A 才得以執(zhí)行。在這種情況下,優(yōu)先級(jí)發(fā)生了翻轉(zhuǎn):線程 B 先于線程 A 運(yùn)行。這樣便不能保證高優(yōu)先級(jí)線程的響應(yīng)時(shí)間。
在 RT-Thread 操作系統(tǒng)中,互斥量可以解決優(yōu)先級(jí)翻轉(zhuǎn)問題,實(shí)現(xiàn)的是優(yōu)先級(jí)繼承算法。優(yōu)先級(jí)繼承是通過在線程 A 嘗試獲取共享資源而被掛起的期間內(nèi),將線程 C 的優(yōu)先級(jí)提升到線程 A 的優(yōu)先級(jí)別,從而解決優(yōu)先級(jí)翻轉(zhuǎn)引起的問題。這樣能夠防止 C(間接地防止 A)被 B 搶占,如下圖所示。優(yōu)先級(jí)繼承是指,提高某個(gè)占有某種資源的低優(yōu)先級(jí)線程的優(yōu)先級(jí),使之與所有等待該資源的線程中優(yōu)先級(jí)最高的那個(gè)線程的優(yōu)先級(jí)相等,然后執(zhí)行,而當(dāng)這個(gè)低優(yōu)先級(jí)線程釋放該資源時(shí),優(yōu)先級(jí)重新回到初始設(shè)定。因此,繼承優(yōu)先級(jí)的線程避免了系統(tǒng)資源被任何中間優(yōu)先級(jí)的線程搶占。
說明
對(duì)于我們開發(fā)來說,要避免發(fā)生優(yōu)先級(jí)翻轉(zhuǎn)的問題。
優(yōu)先級(jí)翻轉(zhuǎn)的危害:
任務(wù)調(diào)度時(shí),時(shí)間不確定性,破壞實(shí)時(shí)系統(tǒng)的實(shí)時(shí)性,嚴(yán)重時(shí)可能導(dǎo)致系統(tǒng)崩潰。
優(yōu)先級(jí)低的任務(wù)比優(yōu)先級(jí)高的任務(wù)更先執(zhí)行,導(dǎo)致任務(wù)的錯(cuò)亂,邏輯的錯(cuò)亂。
原文標(biāo)題:線程優(yōu)先級(jí)翻轉(zhuǎn),如何避免?
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
嵌入式
+關(guān)注
關(guān)注
5094文章
19184瀏覽量
307860 -
RTOS
+關(guān)注
關(guān)注
22文章
819瀏覽量
119903
原文標(biāo)題:線程優(yōu)先級(jí)翻轉(zhuǎn),如何避免?
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
使用CH32V103C8TC設(shè)置中斷優(yōu)先級(jí)分組時(shí),編譯報(bào)錯(cuò)的原因?
freertos中斷優(yōu)先級(jí)在哪設(shè)置
esp32s3 ota升級(jí)過程中,RGBLCD+LVGL顯示異常,屏幕畫面閃爍跳動(dòng)是什么原因導(dǎo)致的?
APS智能優(yōu)化排產(chǎn)軟件的優(yōu)先級(jí)應(yīng)用
![APS智能優(yōu)化排產(chǎn)軟件的<b class='flag-5'>優(yōu)先級(jí)</b>應(yīng)用](https://file1.elecfans.com/web2/M00/F4/0A/wKgaomZ74pSAamRgAABGv1f1AXE050.png)
請(qǐng)問有什么方法降低WIFI中斷的優(yōu)先級(jí)?
如何在不同優(yōu)先級(jí)安裝相同的處理程序?
systick的中斷優(yōu)先級(jí)是否應(yīng)該設(shè)置為最高優(yōu)先級(jí)的嵌套中斷?
創(chuàng)建了兩個(gè)task如果一個(gè)優(yōu)先級(jí)高 一個(gè)優(yōu)先級(jí)低,高優(yōu)先級(jí)的那個(gè)一直在做,什么時(shí)候會(huì)調(diào)度到低優(yōu)先級(jí)的呢?
STM8中斷優(yōu)先級(jí)不夠怎么解決?
嵌入式實(shí)時(shí)操作系統(tǒng)中的優(yōu)先級(jí)反轉(zhuǎn)問題
![嵌入式實(shí)時(shí)操作系統(tǒng)<b class='flag-5'>中</b>的<b class='flag-5'>優(yōu)先級(jí)</b>反轉(zhuǎn)問題](https://file1.elecfans.com/web2/M00/DC/2D/wKgaomYrXJaAYQ0AAAAQgXX2vuA412.jpg)
評(píng)論