優(yōu)先級反轉(zhuǎn)問題以及解決方式

優(yōu)先級反轉(zhuǎn)問題以及解決方式

ID:13748550

大?。?5.50 KB

頁數(shù):7頁

時間:2018-07-24

優(yōu)先級反轉(zhuǎn)問題以及解決方式_第1頁
優(yōu)先級反轉(zhuǎn)問題以及解決方式_第2頁
優(yōu)先級反轉(zhuǎn)問題以及解決方式_第3頁
優(yōu)先級反轉(zhuǎn)問題以及解決方式_第4頁
優(yōu)先級反轉(zhuǎn)問題以及解決方式_第5頁
資源描述:

《優(yōu)先級反轉(zhuǎn)問題以及解決方式》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、優(yōu)先級反轉(zhuǎn)問題以及解決方式優(yōu)先級反轉(zhuǎn)的問題是每一個實時操作系統(tǒng)所必須考慮到的問題,也是嵌入式軟件面試所常提問的問題。下面會詳細(xì)闡述優(yōu)先級反轉(zhuǎn)產(chǎn)生的根源,以及解決方式。首先來談?wù)剝?yōu)先級反轉(zhuǎn)問題的出現(xiàn)的方式。下圖是演示優(yōu)先級反轉(zhuǎn)出現(xiàn)的問題。假設(shè)有3個任務(wù)task1優(yōu)先級最高,task2優(yōu)先級其次,task3優(yōu)先級最低。假設(shè)task1,task2分別阻塞在內(nèi)核對象上比如queue等,然后輪到task3去運行,首先task3獲得了一個semaphore鎖,然后運行了一段時間后,中斷喚醒了task1,出中斷的時候馬上跑task1,因為task1的優(yōu)先級高,然后task1也嘗試去獲得semaphore鎖

2、,但是task3已經(jīng)得到了這個鎖,所以task1只能睡眠,輪到task3繼續(xù)跑,這個時候中斷喚醒了task2,出中斷的時候輪到task2去跑,因為task2的優(yōu)先級比task1要高。task2運行完了然后給task3跑,task3跑完了才輪到task1去跑。以上的現(xiàn)象就是一個完整的優(yōu)先級反轉(zhuǎn)的問題出現(xiàn)的現(xiàn)象,整個邏輯貌似都是完全沒有任何問題的,唯一的問題就是task2跑完了再去跑task1,也就是說task2插了一腳。task2的優(yōu)先級比起task1要低的,這樣的話task1要同時承受task2和task3跑完才能繼續(xù)跑。承受task3跑完是沒有任何爭議的,因為臨界區(qū)的原因,task1只能等

3、task3跑完,但是task1等待task2跑完確是不應(yīng)該的,因為這兩個任務(wù)之間毫無關(guān)系。解決優(yōu)先級反轉(zhuǎn)的方式有兩種,第一種是優(yōu)先級置頂?shù)姆椒?,第二種是優(yōu)先級繼承的方法,詳細(xì)請參考以下mutex章節(jié)。Mutex工作原理以及應(yīng)用mutex的出現(xiàn)是為了解決優(yōu)先級反轉(zhuǎn)的問題,由于優(yōu)先級反轉(zhuǎn)對實時性影響太大,所以mutex的穩(wěn)定性直接影響了實時性??v觀目前多種實時操作系統(tǒng)mutex的設(shè)計原理是多多少少有一點問題的,很多rtos沒有實現(xiàn)mutex優(yōu)先級逐步還原的問題,導(dǎo)致了實時性以及其它的一些邏輯錯誤等等。rawos的mutex模塊成功彌補了其它實時系統(tǒng)在這方面的不足。Rawos的mutex同時支持優(yōu)

4、先級置頂和優(yōu)先級繼承的方式來解決優(yōu)先級反轉(zhuǎn)的問題。優(yōu)先級置頂方法需要給每一個mutex靜態(tài)指定一個優(yōu)先級,第一個獲得mutex的任務(wù)會把優(yōu)先級提高到靜態(tài)指定的優(yōu)先級。優(yōu)先級置頂?shù)姆椒ㄐ枰迅偁庍@個mutex的所有任務(wù)優(yōu)先級都要搞清楚,通常適用于系統(tǒng)中運行的任務(wù)優(yōu)先級不改變的情況。如果一個任務(wù)會獲得多層嵌套的mutex鎖,這個時候使用優(yōu)先級繼承的方法設(shè)計不好的話容易死鎖,但是使用優(yōu)先級置頂?shù)姆椒軌虮苊獯朔N情況出現(xiàn)。下圖是任務(wù)t3獲得mutx1的情況,示例如下:假設(shè)訪問mutex1的任務(wù)有t1,t2,t3,t1的優(yōu)先級為20,t2的優(yōu)先級為25,t3優(yōu)先級為30,數(shù)字越小表明優(yōu)先級越高。這個時

5、候mutex1指定的優(yōu)先級置頂?shù)膬?yōu)先級是19,即比t1,t2的優(yōu)先級要高。假設(shè)任務(wù)t3的首先獲得mutex1,這個時候任務(wù)t3的優(yōu)先級會提升為19,所以t3會運行完之后釋放鎖輪到t1運行綜上所述,優(yōu)先級置頂?shù)脑捫枰孪褥o態(tài)分析清楚,的確是比較麻煩的,好處是系統(tǒng)可以一目了然,不存在暗箱,做到系統(tǒng)每一個點都是很清楚。再來談?wù)剝?yōu)先級繼承的方法,所謂優(yōu)先級繼承的含義是,當(dāng)優(yōu)先級反轉(zhuǎn)發(fā)生的時候,低優(yōu)先級任務(wù)的優(yōu)先級被自動提升為高優(yōu)先任務(wù)的優(yōu)先級,示例如下:假設(shè)任務(wù)t3的優(yōu)先級為30,t2優(yōu)先級為25,t1優(yōu)先級為20。因為數(shù)字越小優(yōu)先級越高,所以t1優(yōu)先級大于t2,t2優(yōu)先級大于t3。假設(shè)t1和t2處

6、于休眠狀態(tài),t3會運行首先獲得了鎖,然后在一個時間點高優(yōu)先級任務(wù)t1被喚醒,搶占了t3,然后t1也嘗試去獲得鎖,因為t3已經(jīng)獲得了鎖,所以t1只能睡眠,就在此時,任務(wù)t3的優(yōu)先級被任務(wù)t1拉升為20。任務(wù)t3會接著繼續(xù)運行,如果此時t2被喚醒,因為優(yōu)先級低于t3,所以不會搶占t3,所以t3會繼續(xù)運行直到釋放鎖,然后t3的優(yōu)先級會被還原到最初值,接著輪到最高優(yōu)先級任務(wù)t1運行。整個過程的關(guān)鍵是中間優(yōu)先級的任務(wù)t2不會打斷t3,也就避免了優(yōu)先級反轉(zhuǎn)的問題。優(yōu)先級反轉(zhuǎn)的問題掌握著實時系統(tǒng)的命脈,這個問題上處理的不當(dāng)?shù)迷?,用戶的系統(tǒng)實時性是得不到任何保障的,縱觀目前的RTOS在mutex這個問題上很

7、多都是處理的不當(dāng)?shù)?,具體以下分析代碼會細(xì)談這個問題。Mutexapi應(yīng)用1RAW_U16raw_mutex_create(RAW_MUTEX*mutex_ptr,RAW_U8*name_ptr,RAW_U8policy,RAW_U8ceiling_prio)函數(shù)功能:此函數(shù)創(chuàng)建了一個mutex.此函數(shù)的參數(shù)有4個,分別含義如下:mutex_ptr為RAW_MUTEX實體控制塊的地址。name_ptr是這個mu

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。