二值信号量和互斥锁到底有什么区别?
原文鏈接:https://www.cnblogs.com/codescrew/p/8970514.html
在說明之前我先拋出結論:互斥鎖和二值信號量在使用上非常相似,但是互斥鎖解決了優先級翻轉的問題
假定我們現在有三個任務,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中途出來攪局浪費大量時間。
?
生活中的實例類比
?
使用信號量的情況:
領導在臺上講話。場內三個角色,領導,組長,小兵。
小兵先拿起話筒說話,領導要講話發現沒有話筒,就等待小兵講完。
組長要講話,由于他比較野蠻,不需要話筒,并制止了小兵說話,自己開始說。
組長講完,小兵接著講
小兵講完,把話筒給領導,領導講完
?
使用互斥鎖的情況:
領導在臺上講話。場內三個角色,領導,組長,小兵。
小兵先拿起話筒說話,領導要講話發現沒有話筒,就等待小兵講完,并且跟小兵說,現在你就是領導的身份
組長要講話,但是他發現領導已經賦予了小兵比自己更高的權限,自己沒有權力打斷,只好作罷
小兵講完,把話筒給領導,領導講完
這時候組長才開始講話
總結
以上是生活随笔為你收集整理的二值信号量和互斥锁到底有什么区别?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: x86中的页表结构和页表项格式
- 下一篇: Qt 工程 pro文件