在多程序、多執行緒併發的環境裡,從概念上看,有多個程序或者多個執行緒在同時執行,具體到單個cpu級別,實際上任何時刻只能有乙個程序或者執行緒處於執行狀態;因此os需要決定哪個程序執行,哪些程序等待,也就是程序的排程。
一、排程的目標
1、首先要區分程式使用cpu的三種模式:io密集型、計算密集型和平衡型。對於io密集型程式來說,響應時間非常重要;對於cpu密集型來說,cpu的周轉時間就比較重要;對於平衡型程式來說,響應和周轉之間的平衡是最重要的。
2、cpu的排程就是要達到極小化平均響應時間、極大化系統吞吐率、保持系統各個功能部件均處於繁忙狀態和提供某種公平的機制。
3、對於實時系統來說,排程的目標就是要達到截止時間前完成所應該完成的任務和提供效能的可**性。
二、排程演算法
1、fcfs(first come first serve),或者稱為fifo演算法,先來先處理。這個演算法的優點是簡單,實現容易,並且似乎公平;缺點在於短的任務有可能變的非常慢,因為其前面的任務占用很長時間,造成了平均響應時間非常慢。
2、時間片輪詢演算法,這是對fifo演算法的改進,目的是改善短程式(執行時間短)的響應時間,其方法就是周期性地進行程序切換。這個演算法的關鍵點在於時間片的選擇,時間片過大,那麼輪轉就越接近fifo,如果太小,程序切換的開銷大於執行程式的開銷,從而降低了系統效率。因此選擇合適的時間片就非常重要。選擇時間片的兩個需要考慮的因素:一次程序切換所使用的系統消耗以及我們能接受的整個系統消耗、系統執行的程序數。
時間片輪詢看上起非常公平,並且響應時間非常好,然而時間片輪轉並不能保證系統的響應時間總是比fifo短,這很大程度上取決於時間片大小的選擇,以及這個大小與程序執行時間的相互關係。
3、stcf演算法(short time to complete first),顧名思義就是短任務優先演算法。這種演算法的核心就是所有的程式都有乙個優先順序,短任務的優先順序比長任務的高,而os總是安排優先順序高的程序執行。
stcf又分為兩類:非搶占式和搶占式。非搶占式stcf就是讓已經在cpu上執行的程式執行到結束或者阻塞,然後在所有的就緒程序中選擇執行時間最短的來執行;而搶占式stcf就不是這樣,在每進來乙個新的程序時,就對所有程序(包括正在cpu上執行的程序)進行檢查,誰的執行時間短,就執行誰。
stcf總是能提供最優的響應時間,然而它也有缺點,第一可能造成長任務的程式無法得到cpu時間而飢餓,因為os總是優先執行短任務;其次,關鍵問題在於我們怎麼知道程式的執行時間,怎麼**某個程序需要的執行時間?通常有兩個辦法:使用啟發式方法估算(例如根據程式大小估算),或者將程式執行一遍後記錄其所用的cpu時間,在以後的執行過程中就可以根據這個測量資料來進行stcf排程。
4、優先順序排程,stcf遇到的問題是長任務的程式可能飢餓,那麼優先順序排程演算法可以通過給長任務的程序更高的優先順序來解決這個問題;優先順序排程遇到的問題可能是短任務的程序飢餓,這個可以通過動態調整優先順序來解決。實際上動態調整優先順序(稱為權值)+時間片輪詢的策略正是linux的程序排程策略之一的 sched_other分時排程策略,它的排程過程如下:
(1)建立任務指定採用分時排程策略,並指定優先順序nice值(-20~19)。
(2)將根據每個任務的nice值確定在cpu上的執行時間(counter)。
(3)如果沒有等待資源,則將該任務加入到就緒佇列中。
(4)排程程式遍歷就緒佇列中的任務,通過對每個任務動態優先順序的計算(counter+20-nice)結果,選擇計算結果最大的乙個去執行,當這個時間片用完後(counter減至0)或者主動放棄cpu時,該任務將被放在就緒佇列末尾(時間片用完)或等待佇列(因等待資源而放棄cpu)中。
(5)此時排程程式重複上面計算過程,轉到第4步。
(6)當排程程式發現所有就緒任務計算所得的權值都為不大於0時,重複第2步。
linux還有兩個實時程序的排程策略:fifo和rr,實時程序會立即搶占非實時程序。
5、顯然,沒有什麼排程演算法是毫無缺點的,因此現代os通常都會採用混合排程演算法。例如將不同的程序分為幾個大類,每個大類有不同的優先順序,不同大類的程序的排程取決於大類的優先順序,同乙個大類的程序採用時間片輪詢來保證公平性。
6、其他排程演算法,保證排程演算法保證每個程序享用的cpu時間完全一樣;彩票排程演算法是一種概率排程演算法,通過給程序「發彩票」的多少,來賦予不同程序不同的呼叫時間,彩票排程演算法的優點是非常靈活,如果你給短任務發更多「彩票」,那麼就類似stcf排程,如果給每個程序一樣多的「彩票」,那麼就類似保證排程;使用者公平排程演算法,是按照每個使用者,而不是按照每個程序來進行公平分配cpu時間,這是為了防止貪婪使用者啟用了過多程序導致系統效率降低甚至停頓。
7、實時系統的排程演算法,實時系統需要考慮每個具體任務的響應時間必須符合要求,在截止時間前完成。
(1)edf排程演算法,就是最早截止任務優先(earliest deadline first)演算法,也就是讓最早截止的任務先做。當新的任務過來時,如果它的截止時間更靠前,那麼就讓新任務搶占正在執行的任務。edf演算法其實是貪心演算法的一種體現。如果一組任務可以被排程(也就是所有任務的截止時間在理論上都可以得到滿足),那麼edf可以滿足。如果一批任務不能全部滿足(全部在各自的截止時間前完成),那edf滿足的任務數最多,這就是它最優的體現。edf其實就是搶占式的stcf,只不過將程式的執行時間換成了截止時間。edf的缺點在於需要對每個任務的截止時間做計算並動態調整優先順序,並且搶占任務也需要消耗系統資源。因此它的實際效果比理論效果差一點。
(2)rms排程演算法,edf是動態排程演算法,而rms(rate monotonic scheduling)演算法是一種靜態最優演算法;該演算法在進行排程前先計算出所有任務的優先順序,然後按照計算出來的優先順序進行排程,任務執行中間既不接收新任務,也不進行優先順序調整或者cpu搶占。因此它的優點是系統消耗小,缺點就是不靈活了。對於rms演算法,關鍵點在於判斷乙個任務組是否能被排程,這裡有乙個定律,如果乙個系統的所有任務的cpu利用率都低於ln2,那麼這些任務的截止時間均可以得到滿足,ln2約等於0.693147,也就是此時系統還剩下有30%的cpu時間。這個證明是liu和kayland在2023年給出的。
三、優先順序反轉
1、什麼是優先順序反轉?
優先順序反轉是指乙個低優先順序的任務持有乙個被高優先順序任務所需要的共享資源。高優先任務由於因資源缺乏而處於受阻狀態,一直等到低優先順序任務釋放資源為止。而低優先順序獲得的cpu時間少,如果此時有優先順序處於兩者之間的任務,並且不需要那個共享資源,則該中優先順序的任務反而超過這兩個任務而獲得cpu時間。如果高優先順序等待資源時不是阻塞等待,而是忙迴圈,則可能永遠無法獲得資源,因為此時低優先順序程序無法與高優先順序程序爭奪cpu時間,從而無法執行,進而無法釋放資源,造成的後果就是高優先順序任務無法獲得資源而繼續推進。
2、解決方案:
(1)設定優先順序上限,給臨界區乙個高優先順序,進入臨界區的程序都將獲得這個高優先順序,如果其他試圖進入臨界區的程序的優先順序都低於這個高優先順序,那麼優先順序反轉就不會發生。
(2)優先順序繼承,當乙個高優先順序程序等待乙個低優先順序程序持有的資源時,低優先順序程序將暫時獲得高優先順序程序的優先級別,在釋放共享資源後,低優先順序程序回到原來的優先級別。嵌入式系統vxworks就是採用這種策略。
這裡還有乙個八卦,2023年的美國的火星探測器(使用的就是vxworks)就遇到乙個優先順序反轉問題引起的故障。簡單說下,火星探測器有乙個資訊匯流排,有乙個高優先順序的匯流排任務負責匯流排資料的訪問,訪問匯流排都需要通過乙個互斥鎖(共享資源出現了);還有乙個低優先順序的,執行不是很頻繁的氣象蒐集任務,它需要對匯流排寫資料,也就同樣需要訪問互斥鎖;最後還有乙個中優先順序的通訊任務,它的執行時間比較長。平常這個系統執行毫無問題,但是有一天,在氣象任務獲得互斥鎖往匯流排寫資料的時候,乙個中斷發生導致通訊任務被排程就緒,通訊任務搶占了低優先順序的氣象任務,而無巧不成書的是,此時高優先順序的匯流排任務正在等待氣象任務寫完資料歸還互斥鎖,但是由於通訊任務搶占了cpu並且執行時間比較長,導致氣象任務得不到cpu時間也無法釋放互斥鎖,本來是高優先順序的匯流排任務也無法執行,匯流排任務無法及時執行的後果被探路者認為是乙個嚴重錯誤,最後就是整個系統被重啟。vxworks允許優先順序繼承,然而遺憾的工程師們將這個選項關閉了。
(3)第三種方法就是使用中斷禁止,通過禁止中斷來保護臨界區,採用此種策略的系統只有兩種優先順序:可搶占優先順序和中斷禁止優先順序。前者為一般程序執行時的優先順序,後者為執行於臨界區的優先順序。火星探路者正是由於在臨界區中執行的氣象任務被中斷發生的通訊任務所搶占才導致故障,如果有臨界區的禁止中斷保護,此一問題也不會發生。
程序排程之優先順序反轉問題
實時作業系統 real time operating system,rtos 是說,任務切換和中斷響應的時間必須保證在多少時間內 如5us內 完成。分為硬實時和軟實作業系統 硬實時是說必須在多少時間內完成切換 如vxworks,我們使用的ecos也是硬實時的 軟實時則是絕大多數情況可以在多少時間內完...
程序優先順序反轉
嵌入式實時系統中的優先順序反轉問題 1 問題的提出 目前,市場上占有率比較高的商業 rtos 有vxworks psos qnx lynxos vrtx,windows ce 等。這些為數眾多的 rtos 絕大多數都是多工實時微核心的結構,採用的是基於優先順序的可搶占式排程策略。系統為每乙個任務分配...
多執行緒多程序優先順序理解 優先順序反轉
1.優先順序反轉 priority inversion 由於多程序共享資源,具有最高優先權的程序被低優先順序程序阻塞,反而使具有中優先順序的程序先於高優先順序的程序執行,導致系統的崩潰。這就是所謂的優先順序反轉 priority inversion 2.產生原因 其實,優先順序反轉是在高優級 假設為...