死鎖 活鎖 優先順序翻轉

2021-07-10 11:58:46 字數 1465 閱讀 1806

這幾個概念中:

死鎖比較常見是多個程序在爭奪系統資源的過程中出現的互相等待,且在無外力作用的情況下,導致無法繼續推進執行的狀況。而這些不能的到系統資源的程序則稱為是死鎖程序,並最終被餓死

導致死鎖的因素有以下幾個:

1、互斥條件

互斥是在訪問臨界資源的時候不能多個程序同時訪問,只能允許其中的乙個程序訪問,這個程序訪問完成之後才能有其他的程序繼續訪問,這種一把使用互斥鎖來實現。

2、請求和保持

這種情況是指當乙個程序已經請求到了一些系統資源,在不放棄對這些系統資源的占用的情況下,又向系統申請了其他的資源,而他所占有的資源因為不能被其他程序使用,同時他所請求的資源又得不到滿足的情況,就會出現死鎖。

3、迴圈等待

這種情況的死鎖發生的時候一般會形成乙個程序-資源的環形鏈,如乙個程序的集合中包含{p1、p2、p3...}而同時,p1、請求p2的資源,p2請求p3的資源....pn請求p1的資源,從而導致任何乙個程序的資源請求都得不到滿足,從而發生了死鎖。

4、不剝奪條件

這種情況是指程序在獲取到乙個資源之後,在使用完這個資源之前是不釋放對這個資源的占有的,只有使用完成之後才會由程序來釋放掉。

解決的辦法就是想辦法不能夠形成除了互斥之外的三個條件。

活鎖是也是在多個程序在請求資源的過程中形成的一種僵化狀態,這種狀態是由於這多個程序之間互相謙讓,都讓其他的程序來先執行,最終導致大家都沒法執行的情況。

而活鎖是有一定的概率破除的,簡單的解決方式就是採用先來先服務的策略,而死鎖是在沒有外力的情況下永遠無法破除。

優先順序反轉這個問題 最早發生在「挑戰者「號火星探測器在執行任務的過程中的。

優先順序反轉是指的是有三個優先順序的程序a、b、c,它們的優先順序分別是高、中、低。而當前高優先順序的程序a需要訪問某個系統資源的時候被低優先順序的程序c占有,從而導致了高優先順序的程序a發生阻塞,而此時中優先順序的程序b搶占了處理器的使用權,從而獲得了執行,導致了較低的優先順序的程序先於較高的優先順序的程序執行,從而發生了系統的錯誤,甚至崩潰,這種問題一般出現在可搶占式的實時作業系統上。

高優先順序的任務a不能夠執行的原因是在於所訪問的資源被低優先順序的任務c占有,從而導致了a的阻塞,如果讓c盡快執行完成就可以避免這種事情的發生。

而解決的辦法有兩種方法:

1、優先順序繼承

當高優先順序的程序因為訪問資源失敗而導致阻塞的時候,可以將低優先順序的程序的優先順序設定為這個阻塞的高優先順序的程序的優先順序,這樣就不會導致中優先順序的程序來搶占處理器。

2、優先順序天花板

對所有可能訪問該資源的任務的優先順序設定為最高優先順序。

兩者的區別:

優先順序繼承:只有乙個任務訪問資源時一切照舊,沒有區別,只有當高優先順序任務因為資源被低優先順序占有而被阻塞時,才會提高占有資源任務的優先順序;而優先順序天花板,不論是否發生阻塞,都提公升,即誰先拿到資源,就將這個任務提公升到該資源的天花板優先順序。

優先順序翻轉

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...