1. 程式人生 > >多線程編程之優先級翻轉問題

多線程編程之優先級翻轉問題

bsp 進行 改變 但是 使用 開始 天花板 優先 多線程

一、什麽是優先級翻轉問題

  所謂優先級翻轉問題(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運行。

二、解決辦法

  解決優先級翻轉問題有優先級天花板和優先級繼承兩種辦法。

1.1 優先級天花板(Priority Ceiling)

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

1.2 優先級繼承(Priority Inheritance)

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

三、對程序員的啟發

  一般來說,優先級反轉對於編寫應用層的人員來說不大會發生,但是對於操作系統的設計者來說確是一個逃不過去的問題。

  作為應用程序開發人員,也應該盡量避免發生優先級翻轉的問題。因此需要註意以下幾點:

  1. 優先級反轉提醒我們使用鎖的代碼段應盡量短;
  2. 註意用小鎖代替大鎖,減少沖突的機會;
  3. 如果鎖保護的代碼段很短,直接使用原子鎖忙等也是不錯的一個方法。

小結:

  本文主要寫了操作系統調度過程中可能發生多線程優先級翻轉的問題,針對此問題,應用程序開發者也應該註意做一些優化。

多線程編程之優先級翻轉問題