程序管理筆記二、程序排程概念及基本策略
程序排程概念及基本策略
引言:多程序併發是邏輯併發,在單個CPU上,實際上任意時刻只能有一個程序處於執行狀態,而其它程序處於非執行狀態。那麼程序是如何排程的呢?本篇筆記將依次介紹程序排程概念、排程目標、排程演算法、演算法評估。下一篇筆記將重點介紹CFS排程演算法。
一、程序排程概念
1.1、排程概念由來
在多程序併發的環境中,雖然概念上有多個程序在同時執行,但是在單個CPU下,實際上任意時刻只能有一個程序處於執行狀態。而其他程序則處於非執行狀態。那麼這就有一個問題需要解決:我們是如何確定在任意時刻到底由哪個程序執行,哪些不執行呢?
1.2、基本概念
程序的排程是作業系統程序管理的一個重要組成部分。其任務是選擇下一個將要執行的程序
1.3、適用情形
- 1)、當一個程序從執行狀態切換到等待狀態
- 2)、當一個程序從執行狀態切換到就緒狀態
- 3)、當一個程序從等待狀態切換到就緒狀態
- 4)、當一個程序終止時
當排程只能發生1和4兩種情況,是程序主動讓出CPU控制權,此時稱排程方案為非搶佔式排程。第2、3種情況,稱為搶佔式排程。
第二種情況中,程序由執行態 直接轉換為就緒態,說明其被強行剝奪了CPU使用權,第三種情況中,程序剛進入就緒態,就要執行,是要搶佔CPU。
二、排程準則
2.1、CPU執行模式
一般來說,程式使用CPU的模式有三種:
- 1)、CPU密集型程式(CPU - bound),這種模式是在CPU上面執行很長時間,接著進行短暫的輸入,這樣迴圈往復。這種程式通常用於科學計算,如矩陣乘法等。
- 2)、IO密集型程式(IO - bound)與第一種相反,這種程式大部分時間都用來I/O,每次I/O後進行短暫的CPU執行,這種程式多用於人機互動類。
- 3)、平衡型程式介於兩者之間,既有長時間的CPU執行部分,又有長時間的I/O部分。或者說程式使用CPU和I/O的時間相差不大。
2.2、排程考量
- 1)、CPU使用率:使CPU儘可能忙,使用率介於40% - 90%,過低會增加企業成本,過高可能存在隱患,降低服務質量。
- 2)、吞吐量:一個單位時間內所完成的程序數量。
- 3)、週轉時間:從程序提交至程序完成的時間間隔,包含等待進入記憶體時間、在就緒佇列中等待時間、CPU上面執行的時間、I/O執行的時間。
- 4)、響應時間:從提交請求到產生第一響應(並非輸出結果)的時間。
2.3、排程目標
自然,對於不同性質的程式,排程所要達到的目的也就有所不同。例如,對於I/O密集型的程式來說,響應時間就比較重要。對於CPU密集型程式來說,週轉時間就比較重要。但是通常排程追求的目標可以概括如下:最大化CPU利用率、最大化吞吐量、最小化週轉時間 、最小化響應時間。
三、排程演算法
電腦科學在發展進步,排程演算法會不斷髮展變化,以期在眾多矛盾的目標中,尋求最佳平衡點。本篇介紹的排程演算法,基本上已經被淘汰不用了,但是學習這些可以幫助我們理解演算法的演進過程,所謂知其然,知其所以然。
3.1、先來先服務FCFS(First Come First Serve)
先來先服務是人的本性中的一個公平觀念,而且在生活中這種規則也隨處可見。其優點是易於理解,易於實現(通過先進先出佇列實現)。缺點是不能搶佔(破壞先來先到原則),不利於分時系統;等待和響應時間變化較大;
假定有三個程序P1、P2、P3,區間時間分別為24、3、3。其到達順序不同會造成不同的等待和響應時間,如下圖所示:
圖1、FCFS等待和響應變化時間不定
3.2、最短任務優先STCF(Shorted Time Complention First)
要改善短任務排在長任務後面而造成響應時間和互動體驗下降的辦法就是短任務優先STCF(Shorted Time Complention First)演算法。這種演算法的核心就是所有的程式並不都一樣,而是有優先順序的區分。具體來說,就是短任務的優先順序比長任務的高,而我們總是安排優先順序高的任務先執行。短任務優先的優點是縮短響應時間,缺點是可能造成長程式無法得到CPU時間而導致“飢餓”。
短任務優先演算法有兩種策略,一種是搶佔式,如果新到達的程序具有比當前程序更短的CPU時間,則進行搶佔。
圖2、搶佔式示意圖
在0 - 2之間,僅有程序P1,當程序P2在2.0時刻到達,其佔用CPU時間為4,小於P1程序剩餘的5,則搶佔CPU。至4.0時刻,P3程序到達,其佔用CPU時間,小於P2,同樣搶佔CPU,依次類推。
另外一種是非搶佔式,一旦程序獲得了CPU,在其CPU區間完成之前,不會被搶佔。
圖3、搶佔式示意圖
在0 - 2之間,僅有程序P1,當程序P2在2.0時刻到達,雖然其佔用CPU時間為4,小於P1程序剩餘的5,但是非搶佔的策略禁止其搶佔CPU。至P1執行完,此時就緒的程序有P2、P3。P3佔用的時間短,優先選擇程序P3。依此類推。
3.3、優先順序排程演算法PB(Priority based)
前面介紹的STCF演算法有一個缺點就是可能造成長程序“飢餓”,賦予每個程序一個優先順序,即可解決這個問題。優先順序排程演算法的原理是給每個程序賦予一個優先順序,每次需要程序切換時,找一個優先順序最高的程序進行排程。這樣,如果賦予長程序一個高優先順序,則該程序就不會再“捱餓”。在後面筆記中,會涉及使用nice、renice動態調整程序優先順序。
優先順序排程的優點是可以賦予重要的程序以高優先順序以確保重要任務能夠得到CPU時間,其缺點則與STCF演算法一樣,低優先順序的程序可能會“飢餓”。這個缺點可以通過老化(aging)解決,即逐漸增加在系統中等待很長時間的程序的優先順序。
3.4、輪轉法排程RR (Round - Robin)
輪轉法(時間片輪轉)演算法是對FCFS演算法的改進,其主要目的是改善短程式的響應時間。方法就是週期性的進行程序切換,每個程序獲得一小段CPU時間(通常是10 - 100ms),時間片用完以後,CPU被搶佔,程序就排在就緒佇列末尾。輪轉法的優點是公平、響應時間非常好,每個程序週期性的獲得CPU。其缺點是程序頻繁切換會消耗系統資源。
如果就緒佇列中有n個程序且時間片為q, 那麼每個程序會得到1 / n的CPU時間(1/n * 總量),每個長度不超過q時間單元(到時強制換出),每個程序必須等待CPU的時間不會超過(n-1)* q個時間單元(這裡未考慮時間片切換消耗)。
圖4、輪轉法排程事例
可以看出,程序P1、P2、P3、P4按次序執行,並且P2在一個時間片內執行完,主動讓出CPU。其時間片越小,上下文切換越頻繁。如果時間片過大,則輪轉法越來越像FCFS。
3.5、多級佇列排程
之前介紹的排程演算法都存在缺點,我們自然想設計一個合理的演算法合併它們的優點,摒棄它們的缺點。這就是多級排程佇列。該演算法的原理是就緒佇列被分成多個獨立的佇列,每個佇列都有自己的排程演算法。例如,前臺(互動式)採用輪轉排程,以獲得更短的響應時間。後臺(批處理)採用FCFS。
圖5、多級佇列排程模型
程序置於優先順序不同的佇列,佇列之間也需要排程,採用固定優先順序可能引起佇列飢餓,採用輪轉法(時間片)可以給每個佇列都有一定時間,可用於排程佇列內不同的程序。
3.6、多級反饋佇列排程
多級反饋佇列排程,是多級佇列排程的改進,其核心思想是允許程序在不同的佇列之間移動,以此實現老化。多級反饋佇列中定義以下引數:佇列數量、每個佇列排程演算法、用以確定程序跨越不同優先權佇列方法(高->低 、 低->高、 跳轉)。
圖6、多級反饋佇列排程舉例
如圖3.6所示,有三個佇列,其中Q0、Q1分別為8ms和16ms的時間片, Q2使用FCFS排程演算法。其排程策略為:新程序進入就緒佇列時被放在佇列0內,佇列0的每個程序都有8ms的時間片。如果一個程序不能在這一個時間片內完成,那麼就被移動到佇列1的末尾。佇列1按照RR排程,每個程序將獲得16ms的時間片,如果沒有完成,將被搶佔並移動至佇列2.,按照FCFS排程策略,完成執行。這樣綜合考慮了響應時間與程序飢餓。
3.7、實時排程演算法
實時系統是一種必須提供實時可預測性的系統,前面的演算法主要考慮平均響應時間和系統吞吐率的問題,而實時系統必須考慮每個具體任務的響應時間符合要求,即每個任務必須在規定時間內完成,而無需考慮降低整個系統的響應時間或者吞吐量。如計算來襲導彈的軌跡等。
常用的實時排程演算法包括EDF(Earliest Deadline First)排程演算法,其核心思想是動態計算每個任務的截止時間,截止時間靠前的程序,優先順序高。其是理論上實時最優排程演算法,其缺點是動態計算截止時間和動態搶佔CPU均會消耗系統的資源,因此EDF演算法的實際效果與理論存在一定差距。
與EDF演算法相對的是,是RMS排程演算法,該演算法的核心思想是在進行排程前先計算所有任務的優先順序,然後按照計算出來的優先順序進行排程,任務執行中間既不接收新的程序,也不進行優先順序的調整或進行CPU搶佔。因此該演算法的優點是系統消耗小,缺點是不夠靈活。一旦任務確定了,就不能接受新的任務。
四、演算法評估方式
演算法的好壞,有很多評估因素,包括CPU利用率、響應時間、系統吞吐量等等。當然可以模擬計算機執行,但是最直接的方式還是將真實的演算法放在實際系統,然後在真實系統條件下對它進行評估。
小結
本篇文章介紹了程序排程的概念、排程目標、排程常用演算法、即其評估方式。後面的文章會介紹通過nice、renice命令調整程序的優先順序,並重點介紹現今廣泛使用的CFS排程策略。
參考資料:
《作業系統之哲學原理》 鄒恆明著
CPU排程.PPT