阻塞允許任務(wù) 2 運行,直到任務(wù) 1 等待的條件出現(xiàn)為止(例如,任務(wù) 2 對兩個任務(wù)共享的資源解鎖)。此時,任務(wù) 1 可以執(zhí)行。任務(wù) 1 須等待的總時間會隨最少時間、平均時間和最多時間變化。這種間隔就是阻塞因數(shù)。如果任務(wù) 1 必須滿足一定的時間限制,該因數(shù)就不能隨任何參數(shù)變化,如線程數(shù)或系統(tǒng)內(nèi)的輸入。換句話說,必須限制阻塞因數(shù)。
現(xiàn)在,我們引入第三個任務(wù)(任務(wù) 3)——其優(yōu)先級比任務(wù) 2 的高但比任務(wù) 1 的低(參見圖 1)。當(dāng)任務(wù) 2 正在運行時,任務(wù) 3 準(zhǔn)備運行,它會搶占任務(wù) 2,而任務(wù) 2 在任務(wù) 3 被阻塞或完成前都無法運行。當(dāng)然,這樣會增加任務(wù) 1 的阻塞因數(shù);也就是說,它會進一步延遲任務(wù) 1 的運行。搶占導(dǎo)致的總延遲就是優(yōu)先級反轉(zhuǎn)。
實際上,可以有多個任務(wù)以這種方式搶占任務(wù) 2,從而導(dǎo)致連續(xù)阻塞的結(jié)果。在這種情況下,任務(wù) 2 可能被無限期地?fù)屨?,產(chǎn)生無限期的優(yōu)先級反轉(zhuǎn),導(dǎo)致任務(wù) 1 無法滿足其最后期限。
這時優(yōu)先級繼承就會發(fā)揮作用。如果我們回到上述假設(shè)中,在同步期內(nèi)使任務(wù) 2 以任務(wù) 1 的優(yōu)先級運行,那么任務(wù) 3 就無法搶占任務(wù) 2,這樣就能避免優(yōu)先級反轉(zhuǎn)的產(chǎn)生(參見圖 2)。

?
圖 1——當(dāng)任務(wù) 3 搶占任務(wù) 2 時,任務(wù) 1 等待任務(wù) 2 完成運行。這進一步推遲了任務(wù) 1 的運行。 4

?
圖 2——任務(wù) 2 繼承了任務(wù) 1 的優(yōu)先級,因而阻止了任務(wù) 3 搶占任務(wù) 2。任務(wù) 3 不再推遲任務(wù) 1 的運行。
提供有保證的 CPU 可用性的分區(qū)調(diào)度
保證資源的可用性對許多系統(tǒng)而言都至關(guān)重要。如果某個關(guān)鍵子系統(tǒng)(如 CPU 周期)丟失,用戶就無法獲取該子系統(tǒng)提供的服務(wù)。例如,在拒絕服務(wù) (DoS) 攻擊中,惡意用戶會利用需要優(yōu)先級高的進程處理的請求攻擊系統(tǒng)。該進程會使 CPU 過載并導(dǎo)致其他進程的 CPU 周期匱乏,從而使用戶無法使用系統(tǒng)。
安全漏洞并非是導(dǎo)致進程匱乏的唯一原因。在許多情況下,增加系統(tǒng)的軟件功能都會導(dǎo)致系統(tǒng)“瀕臨危險邊緣”,導(dǎo)致現(xiàn)有應(yīng)用程序的 CPU 時間匱乏。及時運行的應(yīng)用程序或服務(wù)不再按預(yù)期或要求的那樣迅速響應(yīng)。從歷史角度,解決這一問題的唯一途徑是更新硬件或?qū)浖M行重新編碼(或重新設(shè)計)——這兩種方法都無法讓人滿意。
為解決這些問題,系統(tǒng)設(shè)計人員需要一種可通過硬件或軟件執(zhí)行 CPU 預(yù)算的分區(qū)計劃,以阻止進程或線程獨占其他進程或線程所需的 CPU 周期。實時操作系統(tǒng)正是執(zhí)行 CPU 分區(qū)預(yù)算的最佳選擇,因為實時操作系統(tǒng)已經(jīng)提供了對 CPU、內(nèi)存和其他計算資源的集中訪問。
某些實時操作系統(tǒng)提供了固定分區(qū)調(diào)度算法。系統(tǒng)設(shè)計人員能利用這種調(diào)度算法對任務(wù)進行分組或分區(qū),然后為每個分區(qū)分配一定比例的 CPU 時間。利用這種方法,任何既定分區(qū)內(nèi)的任務(wù)消耗的 CPU 時間都不會超過該分區(qū)靜態(tài)確定的比例。例如,我們假設(shè)為分區(qū)分配了 30% 的 CPU。如果該分區(qū)內(nèi)的進程隨后成為拒絕服務(wù)攻擊的目標(biāo),它會消耗不超過 30% 的 CPU 時間。這種分配限制確保了其他進程保持各自的可用性;例如,它能保證可訪問的用戶界面(如遠(yuǎn)程終端)。因此,操作人員能訪問系統(tǒng)并解決問題——無需按動復(fù)位開關(guān)。 5
但是,這種方法也存在問題。由于調(diào)度算法是固定的,因此一個分區(qū)無法使用分配到另一個分區(qū)的 CPU 周期,即使這些分區(qū)未使用其分配的周期。這種方法會浪費 CPU 周期并阻止系統(tǒng)處理高峰需求。因此,系統(tǒng)設(shè)計人員必須使用更昂貴的處理器應(yīng)對運行緩慢的系統(tǒng),或限制系統(tǒng)能支持的功能數(shù)量。
自適應(yīng)分區(qū)
另一種被稱作自適應(yīng)分區(qū)的方法提供了更靈活的動態(tài)調(diào)度算法,從而有效克服了這些缺陷。與靜態(tài)分區(qū)一樣,自適應(yīng)分區(qū)允許系統(tǒng)設(shè)計人員為單獨進程或一組進程預(yù)留 CPU 周期。因此,系統(tǒng)設(shè)計人員能保證一個子系統(tǒng)或分區(qū)上的負(fù)載不會影響其他子系統(tǒng)的可用性。而且,與靜態(tài)分區(qū)不同的是,自適應(yīng)分區(qū)還能將空閑分區(qū)中的 CPU 周期以動態(tài)方式重新分配到可受益于額外處理時間的分區(qū)——只有當(dāng) CPU 滿載時,分區(qū)預(yù)算才會執(zhí)行。因此,系統(tǒng)就能處理高峰需求并使利用率達(dá)到 100%,同時又能繼續(xù)享受資源保證帶來的收益。
同樣重要的是,自適應(yīng)分區(qū)還能直接應(yīng)用于先有系統(tǒng),而無需重新設(shè)計代碼或修改代碼。例如,在 QNX Neutrino 中,系統(tǒng)設(shè)計人員只需啟動分區(qū)內(nèi)已有的基于 POSIX 應(yīng)用程序,實時操作系統(tǒng)的調(diào)度程序就會確保每個分區(qū)都會收到分配的預(yù)算。在每個分區(qū)內(nèi),會繼續(xù)根據(jù)基于優(yōu)先級的搶占式調(diào)度算法對每項任務(wù)進行調(diào)度——應(yīng)用程序不必更改其調(diào)度運行。此外,系統(tǒng)設(shè)計人員還能以動態(tài)方式重新配置分區(qū),以精確調(diào)節(jié)系統(tǒng)實現(xiàn)最佳性能。

?
圖 3——自適應(yīng)分區(qū)可阻止優(yōu)先級高的任務(wù)消耗超過其分配的規(guī)定比例的 CPU,除非系統(tǒng)包含未使用的 CPU 周期。例如,任務(wù) A 和任務(wù) D 可在分配至分區(qū) 3 的時間內(nèi)運行,因為任務(wù) E 和任務(wù) F 不需要剩余的 CPU 周期預(yù)算。 6
電子發(fā)燒友App


















評論