死鎖 優先順序反轉

2021-08-28 06:19:47 字數 1606 閱讀 8477

文章侵刪。

死鎖在多道程式系統中,多個程序式併發執行,共享系統資源,從而提高了資源利用率和系統吞吐量,但可能發生一種危險----死鎖。所謂死鎖,是指多個程序因競爭資源而形成的一種僵局,若無外力作用,這些程序都將永遠不能再向前推進。

(1)產生死鎖的原因和必要條件

a、產生死鎖的原因

產生死渙的主要原因可歸結為以下兩點

(1)競爭資源

(2)程序推進順序不當。

常用的解除死鎖的方法有兩種:一是強制性地撤銷一些死鎖程序,並剝奪它們的資源給其他的時程;另一種是使用乙個有效的掛起和解除掛起機構來掛起一些程序,以便從被掛起程序中剝奪一些資源,用來解除死鎖。

預防死鎖

(1)打破「請求和保持」條件

打破「請求和保持」條件,即把程序執行中所要求的所有資源在程序開始動行之前,一次性地分配給程序,只要有一種資源不能滿足,該程序就必須等待。這樣,程序在執行過程中就不再需要新的資源,這種方法又稱為預先靜態分配法。

(2)打破「不剝奪」條件

打破「不剝奪」條件,即強迫那些請求新資源而沒有立即得到滿足的程序釋放它已保持的其他資源。這意味著乙個程序在執行過程可以暫時釋放已占有的資源,即允許其他程序剝奪使用該資源,從而破壞了「不剝奪」條件的出現。

(3)打破「環路等待」條件

死鎖產生時,一定存在一種程序和資源的迴圈鏈。打破「環路等待」條件就是在資源的分配過程中,對資源的請求做出某種限制,使環路不可能出現。

1. 優先順序反轉(priority inversion)

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

2. 產生原因

其實,優先順序反轉是在高優級(假設為a)的任務要訪問乙個被低優先順序任務(假設為c)占有的資源時,被阻塞.而此時又有優先順序高於占有資源的任務(c)而低於被阻塞的任務(a)的優先順序的任務(假設為b)時,於是,占有資源的任務就被掛起(占有的資源仍為它占有),因為占有資源的任務優先順序很低,所以,它可能一直被另外的任務掛起.而它占有的資源也就一直不能釋放,這樣,引起任務a一直沒辦法執行.而比它優先低的任務卻可以執行.  

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

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

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

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

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

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

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

a 和b的區別: 

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

死鎖, 優先順序反轉

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

優先順序反轉

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

優先順序反轉

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