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

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

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

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


















評論