os 实时调度算法
分類
可以按不同方式對實時調度算法加以分類:
①根據實時任務性質,可將實時調度的算法分為硬實時調度算法和軟實時調度算法;
②按調度方式,則可分為非搶占調度算法和搶占調度算法。
1.非搶占式調度算法
(1)非搶占式輪轉調度算法:由一臺計算機控制著若干個相同的(或類似的)對象,為每一個被控對象建立一個實時任務,并將它們排成一個輪轉隊列。調度程序每次選擇隊列中的第一個任務投入運行。當該任務完成后,便把它掛在輪轉隊列的末尾等待,調度程序再選擇下一個隊首任務運行。這種調度算法可獲得數秒至數十秒的響應時間,可用于要求不太嚴格的實時控制系統中。
(2) 非搶占式優先調度算法:如果在系統中還含有少數具有一定要求的實時任務,則可采用非搶占式優先調度算法,系統為這些任務賦予了較高的優先級。當這些實時任務到達時,把它們安排在就緒隊列的隊首,等待當前任務自我終止或運行完成后,便可去調度執行隊首的高優先進程。這種調度算法在做了精心的處理后有可能使其響應時間減少到數秒至數百毫秒,因而可用于有一定要求的實時控制系統中。
2.搶占式調度算法
可根據搶占發生時間的不同而進一步分成以下兩種調度算法:
(1)基于時鐘中斷的搶占式優先級調度算法:在某實時任務到達后,如果它的優先級高于當前任務的優先級,這時并不立即搶占當前任務的處理機,而是等到時鐘中斷發生時,調度程序才剝奪當前任務的執行,將處理機分配給新到的高優先級任務。該算法能獲得較好的響應效果,其調度延遲可降為幾十至幾毫秒,可用于大多數的實時系統中。
(2) 立即搶占( Immediate Preemption )的優先級調度算法:在這種調度策略中,要求操作系統具有快速響應外部事件中斷的能力。一旦出現外部中斷,只要當前任務未處于臨界區,便能立即剝奪當前任務的執行,把處理機分配給請求中斷的緊迫任務。這種算法能獲得非??斓捻憫?#xff0c;可把調度延遲降低到幾毫秒至100微秒,甚至更低。圖3-5中的( a )、(b)、( c )、(d)分別示出了四種情況的調度時間。
最早截止時間優先(Earliest Deadline First)算法
該算法是根據任務的截止時間確定任務的優先級,任務的截止時間愈早,其優先級愈高,具有最早截止時間的任務排在隊列的隊首。調度程序在選擇任務時,總是選擇就緒隊中的第一個任務,為之分配處理機。最早截止時間優先算法既可用于搶占式調度方式中,包可用于非搶占式調度方式中。
1.非搶占式調度方式用于非周期實時任務
圖3-6示出了將該算法用于非搶占調度方式之例。該例中具有四個非周期任務,它們先后到達。系統先調度任務1執行,在任務1執行期間,任務2、3又先后到達。由于任務3的開始截止時間早于任務2的,故系統在任務1后將先調度任務3執行。在此期間又到達作業4,其開始截止時間仍是早于任務2的,故在任務3執行完后,系統又先調度任務4執行,最后才調度任務2執行。
2.搶占式調度方式用于周期實時任務
圖3-7示出了將該算法用于搶占調度方式之例。在該例中有兩個周期任務,任務A和任務B的周期時間分別為20ms和50ms,每個周期的處理時間分別為10ms和25ms。
圖3-7示出了將最早截止時間(最后期限)優先算法用于搶占調度的示意圖。圖中的第一行示出了兩個任務的到達時間、截止時間和執行時間圖。其中任務 A 的到達時間為0、20ms、40ms…,任務 A 的最后期限為20ms、40ms、60ms…,任務 B 的到達時間為0、50ms、100 ms ……,任務 B 的最后期限為50ms、100 ms …。
為了說明通常的優先級調度不能適用于實時系統,該圖特增加了第二和第三行。在第二行中,假定任務 A 具有較高的優先級,所以在t=0ms時,先調度 A1 執行,在 A1 完成后(t=10 ms )才調度 B1 執行。在t=20ms時,又重新調度 A 2執行,在t=30ms時, A2 完成,又調度 B1 執行。在 t =40ms時,又調度 A3 執行,在t=50ms時,雖然 A3 已完成,但 B1 已錯過了它的最后期限。這說明利用通常的優先級調度已經失敗。第三行與第二行類似,只是假定任務 B 具有較高的優先級。
第四行是采用最早截止時間優先算法的時間圖。在t=0時, A1 和 B1 同時到達,由于 A1 的截止時間比 B1 早,故調度 A1 執行。在 t =10時, A1 完成又調度 B1 執行。在t=20時, A2 到達,由于 A2 的截止時間比 B1 早, B1 被中斷而調度 A2 執行。在t=30時, A2 完成,又重新調度 B1 執行。在t=40時, A3又到達,但 B1 的截止時間要比 A3 早,仍應讓 B1 繼續執行直到完成(t=45),然后再調度 A3 執行。在t=55時, A3 完成又調度 B2 執行。在該例中,利用最早截止時間優先算法可以滿足系統的要求。
最低松弛度優先LLF(Least Laxity First)算法
該算法在確定任務的優先級時,根據的是任務的緊急(或松弛)程度。任務緊急程度愈高,賦予該任務的優先級就愈高,以使之優先執行。例如,一個任務在200ms時必須完成,而它本身所需的運行時間是100 ms ,因此調度程序必須在100ms之前調度執行,該任務的緊急程度(松弛程度)為100 ms 。又如另一任務在400 ms 時必須完成,它本身需要運行150ms,則其松弛程度為250ms。在實現該算法時要求系統中有一個按松弛度排序的實時任務就緒隊列,松弛度最低的任務排在最前面,調度程序選擇隊列中的隊首任務執行。
該算法主要用于可搶占調度方式中。假如在一個實時系統中有兩個周期性實時任務 A 和 B ,任務 A 要求每20ms執行一次,執行時間為10ms,任務 B 要求每50ms執行一次,執行時間為25 ms 。由此可知,任務 A 和 B 每次必須完成的時間分別為: A1、A2 、A3、…和 B1 、B2 、B3 …,見圖3-8。為保證不遺漏任何一次截止時間,應采用最低松弛度優先的搶占調度策略。
在剛開始時( t =0), A 1必須在20ms時完成,而它本身運行又需10ms,可算出 A 的松弛度為10ms。 B1必須在50ms時完成,而它本身運行就需25ms,可算出 B1 的松弛度為25 ms ,故調度程序應先調度 A1 執行。在=10 ms 時, A2 的松弛度可按下式算出:
A2的松弛度=必須完成時間﹣其本身的運行時間﹣當前時間=40 ms -10 ms -10 ms =20 ms
類似地,可算出 B1 的松弛度為15 ms ,故調度程序應選擇 B1 運行。在t3=30ms時, A2 的松弛度已減為0即40-10-30),而 B1 的松弛度為15ms(即50-5-30),于是調度程序應搶占 B1 的處理機而調度 A2 運行。在t4=40 ms 時, A3的松弛度為10ms(即60-10-40),而 B1 的松弛度僅為5ms(即50-5-40),故又應重新調度 B1 執行。在 t5 =45ms時, B1 執行完成。而此時 A3 的松弛度已減為5ms(即60-10-45),而 B2 的松弛度為30ms(即100-25-45),于是又應調度 A3執行。在t6=55 ms 時,任務 A 尚未進入第4周期,而任務 B 已進入第2周期,故再調度 B2 執行。在 t 7=70ms時, A4 的松弛度已減至0ms(即80-10-70),而B2的松弛度為20ms(即100-10-70),故此時調度程序又應搶占 B2 的處理機而調度 A4 執行。圖3-9示出了具有兩個周期性實時任務的調度情況。
優先級倒置(priority inversion problem)
1.優先級倒置的形成
當前 OS 廣泛采用優先級調度算法和搶占方式,然而在系統中存在著影響進程運行的資源而可能產生“優先級倒置”的現象,即高優先級進程(或線程)被低優先級進程(或線程)廷遲或阻塞。我們通過一個例子來說明該問題。假如有三個完全獨立的進程 P1、P2 和 P3 , P 1的優先級最高, P 2次之, P 3最低。 P1 和 P3 通過共享的一個臨界資源進行交互。下面是一段代碼:
P1: ...P(mutex); CS-1; V(mutex);... P2: ...program2...; P3: ...P(mutex); CS-3; V(mutex);...假如P3最先執行,在執行了 P ( mutex )操作后,進入到臨界區 CS -3。在時刻 a , P2 就緒,因為它比 P 3的優先級高, P2 搶占了 P3 的處理機而運行,如圖3-10所示。在時刻 b , P1 就緒,因為它又比 P2 的優先級高, P1 搶占了 P2 的處理機而運行。在時刻 c , P1 執行 P ( mutex )操作,試圖進入臨界區 CS -1,但因為相應的臨界資源已被 P3 占用,故 P1 將被阻塞。由 P 2繼續運行,直到時刻 d 運行結束。然后由 P 3接著運行,到時刻 e 時 P3 退出臨界區,并喚醒P1。因為它比 P 3的優先級高,故它搶占了 P3 的處理機而運行。
根據優先級原則,高優先級進程應當能優先執行,但在此例中, P1和 P3 共享著“臨界資源”,而出現了不合常理的現象,高優先級進程 P 1因 P3 進程被阻塞了,又因為進程的存在而延長了P1被阻塞的時間,而且被延長的時間是不可預知和無法限定的。由此所產生的“優先級倒置”的現象是非常有害的,它不應該出現在實時系統中。
2.優先級倒置的解決辦法
一種簡單的解決方法是規定:假如進程 P3在進入臨界區后 P3所占用的處理機就不允許被搶占。由圖3-10可以看出, P2 即使優先級高于 P 3也不能執行。于是 P 3就有可能會較快地退出臨界區,不會出現上述情況。如果系統中的臨界區都較短且不多,該方法是可行的。反之,如果 P3 臨界區非常長,則高優先級進程 P1 仍會等待很長的時間,其效果是無法令人満意的。
一個比較實用的方法是建立在動態優先級繼承基礎上的。該方法規定,當高優先級進程 P1要進入臨界區,去使用臨界資源 R ,如果已有一個低優先級進程 P 3正在使用該資源,此時一方面 P1 被阻塞,另一方面由 P3 繼承 P1 的優先級,并一直保持到 P 3退出臨界區。這樣做的目的在于不讓比 P3 優先級稍高,但比 P1優先級低的進程如 P2 進程插進來,導致延緩 P3 退出臨界區。圖3-11示出了采用動態優先級繼承方法后, P 1、 P2、P3 三個進程的運行情況。由圖可以看出,在時刻 c , P1 被阻塞,但由于 P3 已繼承了 P1 的優先級,它比 P2 優先級高,這樣就避免了 P2 的插入,使 P3 在時刻 d 進入臨界區。該方法已在一些操作系統中得到應用,而在實時操作系統中是必須的。
總結
- 上一篇: Xftp-6和Xshell-6免费版下载
- 下一篇: 从小白到web渗透工程师——零基础指南(