優先順序翻轉

2021-09-30 05:55:02 字數 836 閱讀 8843

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

例如:有優先順序為a、b和c三個任務,優先順序a>b>c,任務a,b處於掛起狀態,等待某一事件發生,任務c正在執行,此時任務c開始使用某一共享資源s。在使用中,任務a等待事件到來,任務a轉為就緒態,因為它比任務c優先順序高,所以立即執行。當任務a要使用共享資源s時,由於其正在被任務c使用,因此任務a被掛起,任務c開始執行。如果此時任務b等待事件到來,則任務b轉為就緒態。由於任務b優先順序比任務c高,因此任務b開始執行,直到其執行完畢,任務c才開始執行。直到任務c釋放共享資源s後,任務a才得以執行。在這種情況下,優先順序發生了翻轉,任務b先於任務a執行。   

解決優先順序翻轉問題有優先順序天花板(priority ceiling)和優先順序繼承(priority inheritance)兩種辦法。   

優先順序天花板是當任務申請某資源時, 把該任務的優先順序提公升到可訪問這個資源的所有任務中的最高優先順序, 這個優先順序稱為該資源的優先順序天花板。這種方法簡單易行, 不必進行複雜的判斷, 不管任務是否阻塞了高優先順序任務的執行, 只要任務訪問共享資源都會提公升任務的優先順序。   

優先順序繼承是當任務a 申請共享資源s 時, 如果s正在被任務c 使用,通過比較任務c 與自身的優先順序,如發現任務c 的優先順序小於自身的優先順序, 則將任務c的優先順序提公升到自身的優先順序, 任務c 釋放資源s 後,再恢復任務c 的原優先順序。這種方法只在占有資源的低優先順序任務阻塞了高優先順序任務時才動態的改變任務的優先順序,如果過程較複雜, 則需要進行判斷。

優先順序翻轉

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

FreeRTOS優先順序翻轉

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

優先順序翻轉問題

考慮一台計算機有兩個程序,h優先順序較高,l優先順序較低。排程規則規定只要h處於就緒態它就可以執行。在某一時刻,l處於臨界區中,此時h變到就緒態準備執行 例如,一條i o操作結束 現在h開 始忙等待,但由於當h就緒時l不會被排程,也就無法離開臨界區,所以h將永遠忙等待下去。假定乙個程序中有三個執行緒...