什么是優(yōu)先級(jí)反轉(zhuǎn)(翻轉(zhuǎn))
優(yōu)先級(jí)反轉(zhuǎn)涨缚,是指在使用信號(hào)量時(shí),可能會(huì)出現(xiàn)的這樣一種不合理的現(xiàn)象甚疟,即:
高優(yōu)先級(jí)任務(wù)被低優(yōu)先級(jí)任務(wù)阻塞仗岖,導(dǎo)致高優(yōu)先級(jí)任務(wù)遲遲得不到調(diào)度。但其他中等優(yōu)先級(jí)的任務(wù)卻能搶到CPU資源览妖。-- 從現(xiàn)象上來(lái)看,好像是中優(yōu)先級(jí)的任務(wù)比高優(yōu)先級(jí)任務(wù)具有更高的優(yōu)先權(quán)揽祥。
具體來(lái)說(shuō):當(dāng)高優(yōu)先級(jí)任務(wù)正等待信號(hào)量(此信號(hào)量被一個(gè)低優(yōu)先級(jí)任務(wù)擁有著)的時(shí)候讽膏,一個(gè)介于兩個(gè)任務(wù)優(yōu)先之間的中等優(yōu)先級(jí)任務(wù)開(kāi)始執(zhí)行——這就會(huì)導(dǎo)致一個(gè)高優(yōu)先級(jí)任務(wù)在等待一個(gè)低優(yōu)先級(jí)任務(wù),而低優(yōu)先級(jí)任務(wù)卻無(wú)法執(zhí)行類(lèi)似死鎖的情形發(fā)生拄丰。
一個(gè)具體的例子:
假定一個(gè)進(jìn)程中有三個(gè)線程Thread1(高)府树、Thread2(中)和Thread3(低),考慮下圖的執(zhí)行情況料按。
- T0時(shí)刻奄侠,Thread3運(yùn)行,并獲得同步資源SYNCH1载矿;
- T1時(shí)刻垄潮,Thread2開(kāi)始運(yùn)行,由于優(yōu)先級(jí)高于Thread3闷盔,Thread3被搶占(未釋放同步資源SYNCH1)弯洗,Thread2被調(diào)度執(zhí)行;
- T2時(shí)刻逢勾,Thread1搶占Thread2牡整;
- T3時(shí)刻,Thread1需要同步資源SYNCH1溺拱,但SYNCH1被更低優(yōu)先級(jí)的Thread3所擁有逃贝,Thread1被掛起等待該資源
- 而此時(shí)線程Thread2和Thread3都處于可運(yùn)行狀態(tài)谣辞,Thread2的優(yōu)先級(jí)大于Thread3的優(yōu)先級(jí),Thread2被調(diào)度執(zhí)行沐扳。最終的結(jié)果是高優(yōu)先級(jí)的Thread1遲遲無(wú)法得到調(diào)度泥从,而中優(yōu)先級(jí)的Thread2卻能搶到CPU資源。
上述現(xiàn)象中迫皱,優(yōu)先級(jí)最高的Thread1要得到調(diào)度歉闰,不僅需要等Thread3釋放同步資源(這個(gè)很正常),而且還需要等待另外一個(gè)毫不相關(guān)的中優(yōu)先級(jí)線程Thread2執(zhí)行完成(這個(gè)就不合理了)卓起,會(huì)導(dǎo)致調(diào)度的實(shí)時(shí)性就很差了和敬。
什么是優(yōu)先級(jí)繼承
優(yōu)先級(jí)繼承就是為了解決優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題而提出的一種優(yōu)化機(jī)制。其大致原理是讓低優(yōu)先級(jí)線程在獲得同步資源的時(shí)候(如果有高優(yōu)先級(jí)的線程也需要使用該同步資源時(shí))戏阅,臨時(shí)提升其優(yōu)先級(jí)昼弟。以前其能更快的執(zhí)行并釋放同步資源。釋放同步資源后再恢復(fù)其原來(lái)的優(yōu)先級(jí)奕筐。
與上圖相比舱痘,到了T3時(shí)刻,Thread1需要Thread3占用的同步資源SYNCH1离赫,操作系統(tǒng)檢測(cè)到這種情況后芭逝,就把 Thread3的優(yōu)先級(jí)提高到Thread1的優(yōu)先級(jí)。此時(shí)處于可運(yùn)行狀態(tài)的線程Thread2和Thread3中渊胸,Thread3的優(yōu)先級(jí)大于Thread2的優(yōu)先級(jí)旬盯,Thread3被調(diào)度執(zhí)行。
Thread3執(zhí)行到T4時(shí)刻翎猛,釋放了同步資源SYNCH1胖翰,操作系統(tǒng)恢復(fù)了Thread3的優(yōu)先級(jí),Thread1獲得了同步資源SYNCH1切厘,重新進(jìn)入可執(zhí)行隊(duì)列萨咳。處于可運(yùn)行狀態(tài)的線程Thread1和Thread2中,Thread1的優(yōu)先級(jí)大于Thread2的優(yōu)先級(jí)疫稿,所以Thread1被調(diào)度執(zhí)行培他。
通過(guò)優(yōu)先級(jí)繼承機(jī)制,可以有效解決優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題而克,使優(yōu)先級(jí)最高的Thread1獲得執(zhí)行的時(shí)機(jī)提前靶壮。