RTOS 優先順序翻轉與優先順序繼承

2022-07-06 22:48:11 字數 1292 閱讀 6031

優先順序反轉,是指在使用訊號量時,可能會出現的這樣一種不合理的現象,即:

高優先順序任務被低優先順序任務阻塞,導致高優先順序任務遲遲得不到排程。但其他中等優先順序的任務卻能搶到cpu資源。-- 從現象上來看,好像是中優先順序的任務比高優先順序任務具有更高的優先權。

具體來說:當高優先順序任務正等待訊號量(此訊號量被乙個低優先順序任務擁有著)的時候,乙個介於兩個任務優先之間的中等優先順序任務開始執行——這就會導致乙個高優先順序任務在等待乙個低優先順序任務,而低優先順序任務卻無法執行類似死鎖的情形發生。

乙個具體的例子:

假定乙個程序中有三個執行緒thread1(高)、thread2(中)和thread3(低),考慮下圖的執**況。

優先順序反轉例項圖示

上述現象中,優先順序最高的thread1要得到排程,不僅需要等thread3釋放同步資源(這個很正常),而且還需要等待另外乙個毫不相關的中優先順序執行緒thread2執行完成(這個就不合理了),會導致排程的實時性就很差了。

優先順序繼承就是為了解決優先順序反轉問題而提出的一種優化機制。其大致原理是讓低優先順序執行緒在獲得同步資源的時候(如果有高優先順序的執行緒也需要使用該同步資源時),臨時提公升其優先順序。以前其能更快的執行並釋放同步資源。釋放同步資源後再恢復其原來的優先順序。

帶有優先順序繼承排程過程

與上圖相比,到了t3時刻,thread1需要thread3占用的同步資源synch1,作業系統檢測到這種情況後,就把thread3的優先順序提高到thread1的優先順序。此時處於可執行狀態的執行緒thread2和thread3中,thread3的優先順序大於thread2的優先順序,thread3被排程執行。

thread3執行到t4時刻,釋放了同步資源synch1,作業系統恢復了thread3的優先順序,thread1獲得了同步資源synch1,重新進入可執行佇列。處於可執行狀態的執行緒thread1和thread2中,thread1的優先順序大於thread2的優先順序,所以thread1被排程執行。

通過優先順序繼承機制,可以有效解決優先順序反轉問題,使優先順序最高的thread1獲得執行的時機提前。

優先順序翻轉

ucos是乙個典型的按照優先順序排程的作業系統,優先順序高的任務先執行,優先順序低的任務後執行,然而在任務的排程過程中可能會出現優先順序翻轉的情況。在嵌入式系統的應用中,實時性是乙個重要的指標,而優先順序翻轉是影響系統實時性的重要問題。例如 有優先順序為a b和c三個任務,優先順序a b c,任務a...

優先順序翻轉

所謂優先順序翻轉問題 priority inversion 即當乙個高優先順序任務通過訊號量機制訪問共享資源時,該訊號量已被一低優先順序任務占有,而這個低優先順序任務在訪問共享資源時可能又被其它一些中等優先順序任務搶先,因此造成高優先順序任務被許多具有較低優先順序任務阻塞,實時性難以得到保證。例如 ...

FreeRTOS優先順序翻轉

舉例 高優先順序任務的任務函式 void high task void pvparameters 中等優先順序任務的任務函式 void middle task void pvparameters 低優先順序任務的任務函式 void low task void pvparameters xsemaph...