操作系統中的優先級反轉與中斷機制

操作系統中的優先級反轉與中斷機制

1. 背景

今天看《μC/OS-III源碼分析筆記》的時候學了優先級反轉的概念,書中沒有詳細介紹,於是我在得到APP的搜索引擎中進行了搜索,看到劉旭明老師寫的《嵌入式實時操作系統原理與最佳實踐》中講得很清楚,於是我把原文摘錄了下來,方便學習和記錄,版權歸原作者劉旭明老師所有。

2. 優先級反轉問題

2.1. 優先級反轉

(Priority inversion)

在系統中,有些資源必須是獨佔使用的,多個任務對這樣的資源的併發訪問將導致錯誤的發生。一般來說,對需要獨佔使用的資源必須使用互斥方法將對其的併發訪問串行化1

在優先級多任務系統中引入互斥方案,會導致任務優先級反轉的問題:假如某時低優先級的任務佔有資源,然後又有高優先級的任務申請資源,但因爲不能滿足而被掛起了,即低優先級任務阻塞了高優先級任務的運行。假如這時又有一箇中優先級任務,那麼它會把低優先級任務搶佔。最終高優先級任務會間接地被中優先級任務搶佔了。這種現象叫作優先級反轉。舉例說明:

假如A、D、C三個任務優先級從高到低排列,任務A和C共享互斥信號量R,如果某一時刻任務C已經獲得互斥信號量R,而任務A此時嘗試佔用R,那麼任務A會因爲得不到R而阻塞在R的任務等待隊列中。再假設此時任務D因爲優先級高於任務C從而搶佔了C,進而長期佔有處理器資源,那麼就相當於中優先級的任務D間接阻塞了高優先級任務A的運行。

優先級反轉

Figure 1. 優先級反轉 \text{Figure 1. 優先級反轉}

  • T0時刻,任務C處於運行狀態,運行過程中,任務C獲得了共享資源R。

  • T1時刻,任務A就緒。由於任務A優先級高於任務C,所以它搶佔了任務C,任務A被調度執行。

  • T2時刻,任務A需要共享資源R,但R被更低優先級的任務C所擁有,所以任務A被阻塞等待該資源。任務C得到執行。

  • T3時刻,此時任務D就緒,由於任務D優先級高於任務C,所以它搶佔了任務C,任務D被調度執行。

從整個流程上看,T3時刻,高優先級任務A被低優先級任務D間接地搶佔了。此時優先級最高的任務A不僅要等任務C運行完,還要等優先級低的任務D運行完才能被調度,如果任務D和任務C需要執行很長時間,那麼任務A的執行就不能得到保證,整個系統的實時性能很差。

優先級反轉現象對基於優先級調度的實時系統有很大的影響。在基於優先級調度的系統中,處理器資源是按照優先級分配給任務的,就緒的高優先級任務必須實時獲得處理器。系統中的各種資源,如果採用按照任務優先級分配的原則,那麼高優先級的任務應該是首先被考慮的。優先級反轉的問題將打亂這些原則。

2.2. 優先級繼承和優先級天花板策略

優先級反轉問題的核心原因在於共享資源的訪問規則,即共享資源只能被一個任務佔用,被佔用後其他任務不能強制使用這個資源。在優先級反轉問題上,高優先級任務被低優先級任務阻塞是必定的,但被中優先級任務阻塞則是很無奈的。爲了避免因爲中優先級任務挾持低優先級任務從而阻塞高優先級任務的現象,可以採用一些必要的算法。

有兩種經典的防止優先級反轉的算法:

  • 優先級繼承策略(Priority inheritance):當一個任務佔有了資源並且隨後阻塞了其他申請該資源的任務時,該任務將臨時改變它的優先級爲所有申請該資源的任務中的最高優先級,並以這個臨時優先級在臨界區執行。當任務釋放資源後,則恢復它原有的優先級。從行爲上看,佔有資源的任務的優先級將是“水漲船高”式的多次改變,因爲它的優先級最高,所以它不會被曾經比它優先級高的那些任務搶佔。操作系統從優先級角度安排它儘快執行,儘快釋放資源,但是這樣做操作系統卻犧牲了中等優先級任務的調度機會。

  • 優先級天花板策略(Priority ceilings):將申請(佔有)資源的任務的優先級提升到可能訪問該資源的所有任務的最高優先級(這個最高優先級稱爲該資源的優先級天花板)。

2.2.1. 優先級繼承

優先級繼承策略
Figure 2. 優先級繼承策略 \text{Figure 2. 優先級繼承策略}

初始優先級: A > D > B > C (從高到低排序)

  • T0時刻,只有任務C處於運行狀態,在運行過程中,任務C得到共享資源R。

  • T1時刻,任務B搶佔任務C,並嘗試獲得資源R,因爲優先級繼承的原因,任務C的優先級被提升到任務B的優先級;任務B被阻塞。

  • T2時刻,任務A搶佔任務C,並嘗試獲得資源R,因爲優先級繼承的原因,任務C的優先級被提升到任務A的優先級;任務A被阻塞。

  • 在Ta時刻,任務D就緒,但因爲此時任務C的優先級已經被提升並且比任務D優先級高,所以任務D不能搶佔任務C,任務C繼續運行。

  • T3時刻,任務C釋放資源,它的優先級恢復到原有優先級。任務A得到資源,並因爲優先級原因搶佔任務C。

  • T4時刻,任務A釋放資源,結束運行。任務B得到資源。但此時因爲任務D優先級高於任務B,所以任務D開始運行。

  • T5時刻,任務D結束運行,任務B開始執行。

2.2.2. 優先級天花板

優先級天花板策略

Figure 3. 優先級天花板策略 \text{Figure 3. 優先級天花板策略}

  • T0時刻,只有任務C處於運行狀態。

  • T1時刻,任務C得到共享資源R,因爲優先級天花板策略的原因,任務C的優先級提升到全部可能訪問該資源的任務的最高優先級。

  • Ta時刻,任務A搶佔任務C執行,隨後嘗試獲得資源R,但是失敗並阻塞。任務C繼續運行。

  • Tb時刻,任務B就緒,但是因爲任務C優先級更高,所以只能等待執行。

  • T2時刻任務C釋放資源R,任務A得到資源R。因爲使用優先級天花板策略,任務C優先級恢復到原有優先級。任務A搶佔任務C開始運行。

  • T3時刻,任務A結束運行。任務B開始運行。

  • T4時刻,任務B結束運行。任務C開始繼續運行。

優先級繼承策略對任務執行流程的影響相對較小,因爲只有當高優先級任務申請已被低優先級任務佔有的共享資源這一事實發生時,才提升低優先級任務的優先級。而天花板策略是誰佔有就直接升到最高。形象地說,優先級繼承策略是“水漲船高”,而優先級天花板策略則是“一次到位”。

3. 中斷機制

中斷機制是處理器的重要基礎設施,用來應對各種事件的響應和處理。當外設或者處理器自身有事件發生時,處理器會暫停執行當前的代碼,並轉向處理這些中斷事務。在處理器與外設間的交互大多采用中斷來完成,中斷系統能極大提高系統的效率。

發出中斷請求的來源叫作中斷源。根據中斷源的不同,可以把中斷分爲以下三類:

3.1. 外部中斷

外部中斷是指由系統外設發出的中斷請求,如串口數據的接收、鍵盤的敲擊、打印機中斷、定時器時間到達等。外部中斷大多是可以屏蔽的,程序可以根據具體需要,通過中斷控制器來屏蔽這些中斷請求。

3.2. 內部中斷

內部中斷指因處理器自身的原因引起的異常事件,如非法指令、總線錯誤(取指)或者運算出錯(除0)等。內部中斷基本是不可屏蔽的中斷。

3.3. 軟件中斷

軟件中斷是一種特殊的中斷,它是程序通過軟件指令觸發的,從而主動引起程序流程的變化。比如在用戶級運行的程序在某時刻需要訪問處理器中受到保護的寄存器,則可以通過軟件中斷進入系統級,實現權限的提升1

注:版權歸原作者劉旭明老師所有

4. 參考文獻

[1] 劉旭明. 嵌入式實時操作系統原理與最佳實踐. 機械工業出版社, 2014.

聯繫郵箱:[email protected]
Github:https://github.com/CurrenWong

歡迎轉載/Star/Fork,有問題歡迎通過郵箱交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章