二值信号量和互斥锁到底有什么区别?
原文鏈接:https://www.cnblogs.com/codescrew/p/8970514.html
在說(shuō)明之前我先拋出結(jié)論:互斥鎖和二值信號(hào)量在使用上非常相似,但是互斥鎖解決了優(yōu)先級(jí)翻轉(zhuǎn)的問(wèn)題
假定我們現(xiàn)在有三個(gè)任務(wù),task1,task2,task3,任務(wù)優(yōu)先級(jí)task1最高,然后依次降低。我們知道在系統(tǒng)調(diào)度的時(shí)候當(dāng)兩個(gè)任務(wù)同時(shí)處于就緒態(tài)的時(shí)候,系統(tǒng)會(huì)優(yōu)先執(zhí)行優(yōu)先級(jí)高的任務(wù)
好了,讓我們來(lái)看兩個(gè)案例
優(yōu)先級(jí)翻轉(zhuǎn)分析(使用信號(hào)量)
?在例子中,我們使用pend()函數(shù)來(lái)表示獲取信號(hào)量,用post()函數(shù)來(lái)表示釋放信號(hào)量
如上圖所示,過(guò)程分下面幾步
1.一開(kāi)始task3開(kāi)始運(yùn)行,先獲取到信號(hào)量
2.task1開(kāi)始運(yùn)行嘗試去獲取信號(hào)量失敗被阻塞等待task3執(zhí)行完
3.task3運(yùn)行過(guò)程中,task2被觸發(fā),由于其優(yōu)先級(jí)高于task3,task2被運(yùn)行,浪費(fèi)了大量時(shí)間
4.繼續(xù)運(yùn)行task3,運(yùn)行完后釋放信號(hào)量
5.task1繼續(xù)運(yùn)行
看到這里我們可以得知,本應(yīng)該優(yōu)先級(jí)最高的task1結(jié)果居然是最后開(kāi)始運(yùn)行的,這就是優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象。這明顯是不利的。比如如果有安裝看門(mén)狗,task1在長(zhǎng)時(shí)間沒(méi)有得到執(zhí)行,就會(huì)觸發(fā)看門(mén)狗,導(dǎo)致系統(tǒng)的重啟。
?
改進(jìn)分析(使用互斥鎖)
??在例子中,我們使用lock()函數(shù)來(lái)表示獲取互斥鎖,用unlock()函數(shù)來(lái)表示釋放互斥鎖
如上圖所示,過(guò)程分下面幾步
1.一開(kāi)始task3開(kāi)始運(yùn)行,先獲取到互斥鎖
2.task1開(kāi)始運(yùn)行嘗試去獲取互斥鎖失敗被阻塞等待task3執(zhí)行完,但是此時(shí)提升task3的優(yōu)先級(jí),讓其優(yōu)先級(jí)跟自己一樣
3.task3運(yùn)行過(guò)程中,task2被觸發(fā),由于其優(yōu)先級(jí)低于task3(第2步被提升過(guò)),task2等待運(yùn)行
4.繼續(xù)運(yùn)行task3,運(yùn)行完后釋放互斥鎖
5.task1繼續(xù)運(yùn)行
6.task1執(zhí)行完,執(zhí)行task2
所以過(guò)程跟前面的雖然一樣,但是互斥鎖多做了一個(gè)步驟就是將task3的優(yōu)先級(jí)提升到task1的級(jí)別,防止task2中途出來(lái)攪局浪費(fèi)大量時(shí)間。
?
生活中的實(shí)例類比
?
使用信號(hào)量的情況:
領(lǐng)導(dǎo)在臺(tái)上講話。場(chǎng)內(nèi)三個(gè)角色,領(lǐng)導(dǎo),組長(zhǎng),小兵。
小兵先拿起話筒說(shuō)話,領(lǐng)導(dǎo)要講話發(fā)現(xiàn)沒(méi)有話筒,就等待小兵講完。
組長(zhǎng)要講話,由于他比較野蠻,不需要話筒,并制止了小兵說(shuō)話,自己開(kāi)始說(shuō)。
組長(zhǎng)講完,小兵接著講
小兵講完,把話筒給領(lǐng)導(dǎo),領(lǐng)導(dǎo)講完
?
使用互斥鎖的情況:
領(lǐng)導(dǎo)在臺(tái)上講話。場(chǎng)內(nèi)三個(gè)角色,領(lǐng)導(dǎo),組長(zhǎng),小兵。
小兵先拿起話筒說(shuō)話,領(lǐng)導(dǎo)要講話發(fā)現(xiàn)沒(méi)有話筒,就等待小兵講完,并且跟小兵說(shuō),現(xiàn)在你就是領(lǐng)導(dǎo)的身份
組長(zhǎng)要講話,但是他發(fā)現(xiàn)領(lǐng)導(dǎo)已經(jīng)賦予了小兵比自己更高的權(quán)限,自己沒(méi)有權(quán)力打斷,只好作罷
小兵講完,把話筒給領(lǐng)導(dǎo),領(lǐng)導(dǎo)講完
這時(shí)候組長(zhǎng)才開(kāi)始講話
總結(jié)
以上是生活随笔為你收集整理的二值信号量和互斥锁到底有什么区别?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: x86中的页表结构和页表项格式
- 下一篇: Qt 工程 pro文件