uc/os-iii學習筆記-資源管理(中斷、訊號、訊號量、互斥訊號量)
資源管理
最常用的獨佔共享資源和建立臨界區的方法有以下幾種:
- 關中斷
- 鎖定任務排程器
- 使用訊號量
- 使用互斥型訊號量
關於具體的排程器上鎖和關中斷的方法可以檢視(http://blog.csdn.net/josephgodvim/article/details/51956180)任務釋出部分
關、開中斷
獨佔共享資源最簡單也是最快捷的方法就是關中斷和開中斷,當訪問共享資源的速度很快,以至於訪問共享資源所花的時間小於中斷的關閉時間時,可以使用關、開中斷方法。但是不推薦此方法,此方法會影響到中斷延遲。
關、開中斷是一個任務和一箇中斷服務程式共享變數或者資料結構的唯一方法。
排程器上鎖、解鎖
如果某項任務不需要和中斷服務程式共享變數或資料結構,可以使用排程器上鎖、解鎖的方法訪問共享資源。
在系統鎖住排程器的期間,系統依然響應中斷,如果中斷喚醒了的更高優先順序執行緒,排程器並不會立刻執行它,直到呼叫解鎖排程器函式才嘗試進行下一次排程。同中斷鎖一樣把排程器鎖住也能讓當前執行的任務不被換出,直到排程器解鎖。但和中斷鎖有一點不相同的是,對排程器上鎖,系統依然能響應外部中斷,中斷服務例程依然能進行相應的響應。所以在使用排程器上鎖的方式進行任務同步時,需要考慮好任務訪問的臨界資源是否會被中斷服務例程所修改,如果可能會被修改,那麼將不適合採用此種方式進行同步。
訊號量
訊號量像是一種上鎖機制,程式碼必須獲得對應的鑰匙才能繼續執行,一旦獲得了鑰匙,也就意味著該任務具有進入被鎖部分程式碼的許可權。一旦執行至被鎖程式碼段,則任務一直等待,直到對應被鎖部分程式碼的鑰匙被再次釋放才能繼續執行。
訊號量用於控制對共享資源的保護,但是現在基本用來做任務同步用。
要想獲取資源的任務必須執行“等待”操作,如果該資源對應的訊號量有效值大於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的水平。
相關文章
- 【iCore3 雙核心板_ uC/OS-III】例程八:互斥訊號量
- uc/os-iii學習筆記-任務同步(訊號量、時間標誌組)筆記
- RT-Thread學習筆記2-互斥量與訊號量thread筆記
- 【iCore3 雙核心板_ uC/OS-III】例程六:訊號量——共享資源
- python學習之訊號量Python
- POSIX 訊號量
- 程式間通訊——POSIX 有名訊號量與無名訊號量
- 【iCore3 雙核心板_ uC/OS-III】例程九:任務訊號量
- 臨界區,互斥量,訊號量,事件的區別事件
- 作業系統 訊號量vs互斥鎖作業系統
- 【iCore4 雙核心板_uC/OS-II】例程七:互斥訊號量
- 程式間通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行緒間通訊機制(互斥鎖、條件變數、posix匿名訊號量)記憶體佇列執行緒變數
- 【iCore3 雙核心板_ uC/OS-III】例程七:訊號量——任務同步
- liteos訊號量(八)
- django的訊號量Django
- Python 訊號量Python
- 互斥鎖和訊號量有什麼不同?(譯)
- 訊號量、訊息佇列、共享記憶體複習佇列記憶體
- 程序間通訊(4)-訊號量
- uc/os-iii學習筆記-訊息傳遞筆記
- 畫江湖之 Go 學習篇 【訊號量】Go
- 畫江湖之 Go 學習篇 [訊號量]Go
- 10. Semaphore ||(訊號量)
- 程式通訊之無名訊號量
- 對記錄型訊號量的理解
- 【iCore4 雙核心板_uC/OS-II】例程五:訊號量——共享資源
- 2.3.2 訊號量機制——作業系統筆記作業系統筆記
- 用訊號量解決程式的同步與互斥探討
- Linux中訊號量的實現Linux
- Linux中的System V訊號量Linux
- Semaphore訊號量原始碼解析原始碼
- IPCS ipcrm刪除訊號量
- system -v 訊號量的使用
- Linux程式間通訊——使用訊號量Linux
- Python執行緒專題5:訊號量與有邊界的訊號量Python執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- PHP 訊號中斷系統PHP
- go中semaphore(訊號量)原始碼解讀Go原始碼