優先級翻轉(轉)

優先級反轉+解決方案
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的區別:
   
  優先級繼承,只有當佔有資源的低優先級的任務被阻塞時,纔會提高佔有資源任務的優先級,而優先級天花板,不論是否發生阻塞,都提升.

 

百度百科: 

  所謂優先級翻轉問題(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 與A的優先級,如發現任務C 的優先級小於A的優先級, 則將任務C的優先級提升到A的優先級, 任務C 釋放資源S 後,再恢復任務C 的原優先級。這種方法只在佔有資源的低優先級任務阻塞了高優先級任務時才動態的改變任務的優先級,如果過程較複雜, 則需要進行判斷。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章