1. 程式人生 > >二值信號量和互斥鎖到底有什麽區別?

二值信號量和互斥鎖到底有什麽區別?

post 改進 觸發 情況 等待 如果 str 長時間 PE

在說明之前我先拋出結論:互斥鎖和二值信號量在使用上非常相似,但是互斥鎖解決了優先級翻轉的問題


假定我們現在有三個任務,task1,task2,task3,任務優先級task1最高,然後依次降低。我們知道在系統調度的時候當兩個任務同時處於就緒態的時候,系統會優先執行優先級高的任務

好了,讓我們來看兩個案例

優先級翻轉分析(使用信號量)


在例子中,我們使用pend()函數來表示獲取信號量,用post()函數來表示釋放信號量

技術分享圖片

如上圖所示,過程分下面幾步

1.一開始task3開始運行,先獲取到信號量

2.task1開始運行嘗試去獲取信號量失敗被阻塞等待task3執行完

3.task3運行過程中,task2被觸發,由於其優先級高於task3,task2被運行,浪費了大量時間

4.繼續運行task3,運行完後釋放信號量

5.task1繼續運行

看到這裏我們可以得知,本應該優先級最高的task1結果居然是最後開始運行的,這就是優先級反轉現象。這明顯是不利的。比如如果有安裝看門狗,task1在長時間沒有得到執行,就會觸發看門狗,導致系統的重啟。

改進分析(使用互斥鎖)


在例子中,我們使用lock()函數來表示獲取互斥鎖,用unlock()函數來表示釋放互斥鎖

技術分享圖片

如上圖所示,過程分下面幾步

1.一開始task3開始運行,先獲取到互斥鎖

2.task1開始運行嘗試去獲取互斥鎖失敗被阻塞等待task3執行完,但是此時提升task3的優先級,讓其優先級跟自己一樣

3.task3運行過程中,task2被觸發,由於其優先級低於task3(第2步被提升過),task2等待運行

4.繼續運行task3,運行完後釋放互斥鎖

5.task1繼續運行

6.task1執行完,執行task2

所以過程跟前面的雖然一樣,但是互斥鎖多做了一個步驟就是將task3的優先級提升到task1的級別,防止task2中途出來攪局浪費大量時間

生活中的實例類比


使用信號量的情況:

領導在臺上講話。場內三個角色,領導,組長,小兵。

小兵先拿起話筒說話,領導要講話發現沒有話筒,就等待小兵講完。

組長要講話,由於他比較野蠻,不需要話筒,並制止了小兵說話,自己開始說。

組長講完,小兵接著講

小兵講完,把話筒給領導,領導講完

使用互斥鎖的情況:

領導在臺上講話。場內三個角色,領導,組長,小兵。

小兵先拿起話筒說話,領導要講話發現沒有話筒,就等待小兵講完,並且跟小兵說,現在你就是領導的身份

組長要講話,但是他發現領導已經賦予了小兵比自己更高的權限,自己沒有權力打斷,只好作罷

小兵講完,把話筒給領導,領導講完

這時候組長才開始講話

以上是個人對二值信號量和互斥鎖區別的理解,初入職場。對於知識的把握難免會有所不足,歡迎各位大佬批評指正

二值信號量和互斥鎖到底有什麽區別?