文章目錄
- 基礎知識
- 互斥量
- 互斥量與信號量區別
- 優先級反轉
- 優先級繼承
- 小結
基礎知識
[FreeRTOS 基礎知識] 信號量 概念
互斥量
互斥量(Mutex,全稱:Mutual Exclusion),在計算機科學中,是一種用于防止多個進程同時訪問某個共享資源的同步機制。互斥量通常用于多線程環境中,以確保在某一時刻只有一個線程可以訪問特定的數據或代碼段。
互斥量與信號量區別
信號量可以控制多個線程同時訪問資源的數量。
信號量可分為兩種類型:(1)計數類型,取值范圍0~MAX(MAX值可以設定);(2)二進制類型,取值范圍0/1
互斥量確保在某一時刻只有一個線程可以訪問資源。 取值范圍0/1。互斥量比信號量多了個優先級繼承。
優先級反轉
系統中如果只有信號量與任務優先級,會出現優先級翻轉。如下圖所示:
1、當低優先級任務C獲取到信號量,運行過程中還沒有來得及釋放信號量。中優先級任務B搶占CPU資源運行,低優先級C停止運行。
2、在中優先級任務B運行過程中,高優先級任務A搶占CPU資源運行,中優先級任務B停止運行。
3、在高優先級任務A運行過程中,由于低優先級任務C占用信號量資源,則獲取信號量失敗,會將任務掛起。
4、高優先級任務A掛起后,中優先級任務B優先獲取CPU使用權運行。
若此時中優先級任務B一直占用CPU資源運行,則低優先級任務C永遠得不到機會釋放信號量,從而高優先級任務A也永遠獲得信號量運行。此時高優先級任務A將受到中優先級和低優先級任務的限制。
這種現象稱為優先級反轉。
優先級繼承
為了解決上述優先級反轉的現象,引入互斥量。互斥量的優先級繼承特點就能解決這個問題。 如下圖所示:
當高優先級任務A 獲取信號量失敗掛起,同時會將持有該信號量的任務優先級等級提高并執行。
此時低優先級任務C獲得執行權限,運行并釋放信號量sem,同時喚醒高優先級任務執行并恢復之前的優先級。
這就是優先級繼承。
小結
互斥量就是特殊的隊列。
互斥量是特殊的信號量。
互斥量實現優先級繼承。