死鎖, 優先順序反轉

2021-10-05 22:39:31 字數 2548 閱讀 7440

死鎖

要將執行緒阻塞住,不繼續向下執行有兩個方法:一種直接讓執行緒睡覺,不占用cpu資源,cpu不分配時間給這個執行緒,另一種就是忙等osspinlock(自旋鎖),等待鎖的執行緒處於忙等(busy-wait)狀態,一直占用著cpu資源(一直用while迴圈判斷鎖有麼有被放開);

自旋鎖優先順序反轉

比如有thread1,thread2,thread3假設開啟了3條執行緒,有可能這三個執行緒同時執行任務,執行緒排程(安排時間給執行緒執行任務),cpu有給3個執行緒的執行時間比如都是10ms,大家就覺得在同時進行,實現多執行緒方案.這個就是時間片輪轉排程演算法,其實作業系統在排程程序和執行緒都是使用時間片輪轉,這裡還有執行緒優先順序問題,如果thread1的優先順序比較高,那給thread1分配的時間多,或者先讓thread1執行.

比如thread1 優先順序最高 , thread2 優先順序中等,thread3優先順序最低

假設thread2先進來發現鎖沒有加,意味著先把鎖鎖住,對資源進行處理,緊接著thread1進來,發現鎖被別人加過了,所以thread1就會忙等一直判斷鎖是否被解開,由於thread1的優先順序比較高,有可能cpu一直在分配時間給thread1,cpu就沒有時間分配給thread2讓執行緒2執行對資源處理的**,thread2的**不能繼續往下走,就永遠放不開這把鎖,那麼thread3就一直等,就死鎖了,

這裡如果讓執行緒1不是忙等而是去睡覺的話,就不會占用cpu資源,這樣就不會出現死鎖現象

優先順序反轉和解決

優先順序反轉的描述:

假設任務1,任務2,任務3;他們的優先順序順序分別為1 > 2 > 3。有乙個稀缺資源s,s由乙個訊號量控制為互斥訪問。

任務3正在執行,並申請到了資源s;

任務1搶占了任務3的執行,任務3掛起,任務1執行;

任務1申請資源s,發現被占用,所以掛起,任務3恢復執行;

任務2搶占了任務3的執行,任務3掛起,任務2執行;

任務2執行完畢,任務3恢復;

任務3釋放資源s,任務1搶占資源s,任務1執行,任務3掛起;

任務1執行完畢,任務3執行。

以上可以看出,任務2雖然比任務1優先順序低,但是比任務1優先執行。也就是說任務1的優先順序被降低到了任務3的級別。

分析:由於稀缺資源s的獨占性,任務3在申請到資源後,任務1必然會在任務3釋放資源後才能執行完成。而任務2肯定會搶占任務3的執行。這個時候,要想任務1比任務2之前執行,有兩種方法:任務3釋放資源,任務2不能搶占任務3。

任務3釋放資源。這條路走不通,因為獨佔資源沒有操作完成就釋放,要麼回滾,要麼出錯。(x)

任務2不能搶占任務3。提公升任務3的優先順序高於任務2就可以了。(v)提高到多少?假如任務1和任務5共搶資源s,那麼任務2、3、4都有可能搶去任務5的執行權,所以任務提公升一定要和資源s被申請的最高優先順序平等或者大於。對於有相同優先順序的核心來說,任務5提公升到任務1的優先順序即可,對於優先順序單一的核心,如ucos,就要提公升到高一點。

解決方法:

優先順序天花板。當任務3使用資源s時,就把任務3的優先順序提公升到能訪問資源s的最高優先順序,執行完成釋放資源之後,把優先順序再改回來;這樣的方法,簡單易行,解決了多個高優先順序任務搶占資源s的問題。但是帶來了一些缺點,就是不一定每次都有高優先順序任務搶占資源s,每次都提公升優先順序是對cpu資源的一種浪費。

優先順序繼承。當任務3使用資源s時,任務1搶占執行權,申請資源s,比較資源1和資源3的優先順序,假如任務1優先順序高,才提公升任務3,提公升到和任務1相同的優先順序,當任務3釋放資源後,將優先順序再調整回來。相對於優先順序天花板方法,相當於延後執行,克服了任務1的缺點,自己本身的特點是,邏輯複雜,需要作業系統支援相同優先順序。在ucos中不容易實現。

兩者結合的方案:當任務3使用資源s時,任務1搶占執行權,申請資源s,比較資源1和資源3的優先順序,假如任務1優先順序高,才提公升任務3,提公升到能訪問資源s的最高優先順序,當任務3釋放資源後,將優先順序再調整回來。

優先順序反轉和解決方法

優先順序反轉(priority inversion)

由於多程序共享資源,具有最高優先權的程序被低優先順序程序阻塞,反而使具有中優先順序的程序先於高優先順序的程序執行,導致系統的崩潰。這就是所謂的優先順序反轉(priority inversion)。

所以,乙個解決辦法就是提高占有資源任務的優先順序,讓它正常執行,然後釋放資源,以讓任務a能正常獲取資源而得以執行.

解決方案 ( 優先順序繼承 / 優先順序天花板 )

目前解決優先順序反轉有許多種方法。其中普遍使用的有2種方法:一種被稱作優先順序繼承(priority inheritance);另一種被稱作優先順序極限(priority ceilings)。

a. 優先順序繼承(priority inheritance)

優先順序繼承是指將低優先順序任務的優先順序提公升到等待它所占有的資源的最高優先順序任務的優先順序.當高優先順序任務由於等待資源而被阻塞時,此時資源的擁有者的優先順序將會自動被提公升.

b. 優先順序天花板(priority ceilings)

優先順序天花板是指將申請某資源的任務的優先順序提公升到可能訪問該資源的所有任務中最高優先順序任務的優先順序.(這個優先順序稱為該資源的優先順序天花板)

a 和b的區別:

優先順序繼承,只有當占有資源的低優先順序的任務被阻塞時,才會提高占有資源任務的優先順序,而優先順序天花板,不論是否發生阻塞,都提公升.

優先順序反轉+解決方案

死鎖 優先順序反轉

文章侵刪。死鎖在多道程式系統中,多個程序式併發執行,共享系統資源,從而提高了資源利用率和系統吞吐量,但可能發生一種危險 死鎖。所謂死鎖,是指多個程序因競爭資源而形成的一種僵局,若無外力作用,這些程序都將永遠不能再向前推進。1 產生死鎖的原因和必要條件 a 產生死鎖的原因 產生死渙的主要原因可歸結為以...

優先順序反轉

1.優先順序反轉 priority inversion 由於多程序共享資源,具有最高優先權的程序被低優先順序程序阻塞,反而使具有中優先順序的程序先於高優先順序的程序執行,導致系統的崩潰。這就是所謂的優先順序反轉 priority inversion 2.產生原因 其實,優先順序反轉是在高優級 假設為...

優先順序反轉

實時作業系統中,在訊號量使用過程中,則可能出現優先順序反轉的不合理情況。1.優先順序翻轉出現場景 高優先順序的任務被低優先順序的任務阻塞,導致高優先順序任務得不到排程和執行。但是其他中等優先順序的任務卻能搶占到cpu資源。從現象看好像是中優先順序任務比高優先順序任務具有更高的優先權。當系統高優先順序...