什么是線程優(yōu)先級翻轉(zhuǎn)籽腕?我們首先來看一張圖:
有三條線程A嗡呼、B、C皇耗,線程優(yōu)先級是A > B > C南窗,在時(shí)間[0,t1]時(shí)郎楼,C線程訪問共享資源S万伤,標(biāo)記為C(S)
,此時(shí)A呜袁,B等待事件到來被掛起敌买。t1時(shí)刻,A線程有任務(wù)就緒(普通的任務(wù)阶界,非訪問共享資源S)虹钮,此時(shí)時(shí)間片[t1, t2]交給任務(wù)A執(zhí)行任務(wù),標(biāo)記任務(wù)A
膘融。t2時(shí)刻芙粱,A線程的任務(wù)執(zhí)行完畢,并試圖訪問共享資源S氧映,標(biāo)記為A(S)
春畔。但是因?yàn)榇藭r(shí)C線程正在訪問S----C(S)
,所以[t2 , t3]時(shí)間片A(S)
只能等待C(S)
完成。t3時(shí)刻拐迁,任務(wù)B就緒蹭劈,因?yàn)锽優(yōu)先級高于C疗绣,所以[t3, t4]時(shí)刻线召,任務(wù)B得到執(zhí)行。然后[t4, t5]時(shí)間片內(nèi)C(S)
訪問完畢后多矮,在[t5, t6]時(shí)刻A(S)
才得到執(zhí)行缓淹。這就造成了高優(yōu)先級的任務(wù)被低優(yōu)先級的任務(wù)搶先執(zhí)行,就叫做優(yōu)先級翻轉(zhuǎn)塔逃。
解決優(yōu)先級翻轉(zhuǎn)有兩種方法:
優(yōu)先級天花板
??優(yōu)先級天花板是當(dāng)任務(wù)申請某資源時(shí)讯壶,把該任務(wù)的優(yōu)先級提升到可訪問這個(gè)資源的所有任務(wù)中最高優(yōu)先級。這種方法簡單易行湾盗,不比進(jìn)行復(fù)雜的判斷伏蚊,不管任務(wù)是否阻塞了高優(yōu)先級任務(wù)的運(yùn)行,只要任務(wù)訪問共享資源都會提升任務(wù)的優(yōu)先級格粪。優(yōu)先級繼承
??優(yōu)先級繼承是當(dāng)任務(wù)A申請共享資源S時(shí)躏吊,如果S正在被任務(wù)C訪問,比較A和C的優(yōu)先級帐萎,發(fā)現(xiàn)C的優(yōu)先級小于A優(yōu)先級比伏,將任務(wù)C優(yōu)先級提升到A的優(yōu)先級,待C釋放S資源后疆导,在恢復(fù)C到原有優(yōu)先級赁项。
結(jié)論:
- 使用鎖的代碼應(yīng)盡量短
- 使用小鎖替代大鎖,減少搶占機(jī)會