uc/os-iii學習筆記-資源管理(中斷、訊號、訊號量、互斥訊號量)
資源管理
最常用的獨佔共享資源和建立臨界區的方法有以下幾種:
關、開中斷
獨佔共享資源最簡單也是最快捷的方法就是關中斷和開中斷,當訪問共享資源的速度很快,以至於訪問共享資源所花的時間小於中斷的關閉時間時,可以使用關、開中斷方法。但是不推薦此方法,此方法會影響到中斷延遲。
關、開中斷是一個任務和一箇中斷服務程式共享變數或者資料結構的唯一方法。
排程器上鎖、解鎖
如果某項任務不需要和中斷服務程式共享變數或資料結構,可以使用排程器上鎖、解鎖的方法訪問共享資源。
在系統鎖住排程器的期間,系統依然響應中斷,如果中斷喚醒了的更高優先順序執行緒,排程器並不會立刻執行它,直到呼叫解鎖排程器函式才嘗試進行下一次排程。同中斷鎖一樣把排程器鎖住也能讓當前執行的任務不被換出,直到排程器解鎖。但和中斷鎖有一點不相同的是,對排程器上鎖,系統依然能響應外部中斷,中斷服務例程依然能進行相應的響應。所以在使用排程器上鎖的方式進行任務同步時,需要考慮好任務訪問的臨界資源是否會被中斷服務例程所修改,如果可能會被修改,那麼將不適合採用此種方式進行同步。
訊號量
訊號量像是一種上鎖機制,程式碼必須獲得對應的鑰匙才能繼續執行,一旦獲得了鑰匙,也就意味著該任務具有進入被鎖部分程式碼的許可權。一旦執行至被鎖程式碼段,則任務一直等待,直到對應被鎖部分程式碼的鑰匙被再次釋放才能繼續執行。
訊號量用於控制對共享資源的保護,但是現在基本用來做任務同步用。
要想獲取資源的任務必須執行“等待”操作,如果該資源對應的訊號量有效值大於1,則任務可以獲得該資源,任務繼續執行。如果該訊號量的有效值為0,則任務加入等待訊號量的任務表中。如果等待時間超過某一個設定值,該訊號量仍然沒有被釋放掉,則等待訊號量的任務就進入就緒態,如果將等待時間設定為0的話任務就將一直等待該訊號量
訊號量通常分為兩種:二進位制訊號量和計數型訊號量。
- 二進位制訊號量只能取0和1兩個值,計數型訊號量的訊號量值大於1,計數型訊號量的範圍由OS_SEM_CTR決定,OS_SEM_CTR可以為8位,16位和32位,取值範圍分別為:0~255,0~65535和0~4294967295。
- 二進位制訊號量用於那些一次只能一個任務使用的資源,比如I/O裝置,印表機計,數型訊號量用於某些資源可以同時被幾個任務所使用,比如一個快取池有10個快取塊,那麼同時最多可以支援10個任務來使用記憶體池。
優先順序反轉
優先順序反轉簡單的來說就是低優先順序的任務由於佔有了訊號量而導致高優先順序任務無法獲得訊號量,只能等待低優先順序任務執行完畢釋放訊號量才可以得到執行,這樣一來高優先順序任務的優先順序就降低到了和低優先順序任務的同等水平。
解決的方法就是使用互斥訊號量在優先順序反轉出現時暫時提升低優先順序任務的優先順序到高優先順序任務同等的優先順序等級。
互斥型訊號量
具體語言描述就不必了, 簡單就是提高任務L的優先順序到任務H的水平。