作業系統CPU排程
阿新 • • 發佈:2019-02-04
概述
多道程式作業系統的基礎。通過在程序之間切換CPU,作業系統可以提高計算機的吞吐率。
對於單處理器系統,每次只允許一個程序執行:任何其他程序必須等待,直到CPU空閒能被排程為止。
CPU按一定的排程演算法從就緒佇列中選擇一個程序,把CPU的使用權交給被選中的程序,如果沒有就緒程序,系統會安排一個系統空閒程序或系統空閒程序。
排程觸發事件:
- 建立、喚醒、退出等程序控制操作
- 程序等待I/O,I/O中斷
- 時鐘中斷(時間片用完,計時器到時)
- 出現abort異常
排程過程
同時把多個程序匯入記憶體,在記憶體中等待的就緒佇列的節點是PCB,使得一個程序在CPU中執行I/O時,一個程序用來填補CPU的時間。 通常程序都是在CPU區間和I/O區間之間轉換。
CPU排程程式稱為短期排程程式,從記憶體排程到CPU。
搶佔排程和非搶佔排程(協作):前者為一個程序還沒結束之前就被奪取CPU的擁有權,而後者則要一個程序結束或等待I/O才給予其他程序CPU的擁有權。
雖然現代作業系統都是用搶佔排程,但是對於同時訪問一個數據來說就會有風險,比如一個程序在試圖更新一個數據,但是另一個程序搶佔,並且讀取這個資料,使得資料不一致。程序同步可以使資料得到安全的訪問。
排程準則:
- CPU使用率。
- 吞吐量:單位時間完成程序的數量。
- 週轉時間:程序提交到程序完成。即從磁碟等待進入記憶體+就緒佇列等待時間+CPU執行時間+I/O執行時間。但是CPU排程演算法只是裡面的一塊。
- 等待時間:在就緒佇列等待的時間之和。
- 響應時間:用於互動系統。
具體步驟:
- 儲存程序A的上下文環境(程式計數器,程式狀態字,其他暫存器)
- 更新A的PCB(新狀態和其他資訊)
- 把程序A移至合適佇列(就緒,阻塞,…)
- 把程序B的狀態設定為執行態
- 從程序B的PCB中恢復上下文(程式計數器,程式狀態字,其他暫存器)
上下文切換的開銷:
- 儲存和恢復暫存器
- 切換地址空間(相關指令可能比較昂貴)
- 快取和緩衝失效(快取記憶體,緩衝區快取,TLB)
排程演算法
各種排程演算法:
多處理器排程:
- 需要決定在哪一個CPU上執行
- 要考慮程序在多個CPU之間遷移的開銷(快取記憶體失效,TLB失效),儘可能使CPU總在同一個程序上執行
要考慮負載均衡問題
- FCFS 先到先服務
一旦選定程序,那麼在結束之前就不能再切換到另一個程序。 - SJF 最短優先 精確的講是最短下一個CPU區間的演算法
前面提到,一個程序是由CPU區間和I/O區間交替組成的。而SJF是看哪個程序的CPU區間最短。
- FCFS 先到先服務
- SRTF搶佔式:又稱最短剩餘優先,當新進來的程序的CPU區間比當前執行的程序所剩的CPU區間短,則搶佔。
- 非搶佔:稱為下一個最短優先,因為在就緒佇列中選擇最短CPU區間的程序放在隊頭。
SJF用於長期排程而不能用短期排程,因為程序是一個整體,CPU沒法知道程序中第一個CPU區間長度。
SJF需要確定下一個CPU區間的時間長度,可以通過近似估算出下一個CPU區間的長度,比如tn+1=atn+(1-a)rn tn為最近最近一次的CPU時間,rn為歷史記錄。a是給定的權重。
- 優先順序排程演算法 pintos的優先順序是0-63 0為最低優先順序,63為最高優先順序
SJF是特殊的優先順序排程演算法,以CPU區間長度的倒數為優先順序。
(1)內部優先順序:通過內部資料比如記憶體要求等。
(2)外部優先順序:使用者自己設定。set_priority
分為搶佔式和非搶佔式,前者為如果進來的程序優先順序高於執行的程序,則替換;後者只是在就緒佇列中按優先順序排隊。
缺點:無線阻塞或飢餓。前者為一個優先順序高且執行時間長的程序一直阻塞,後者為優先順序低的程序永遠都得不到執行。
解決飢餓的方法是老化。通過每個時間間隔後將等待的程序優先順序降低。 - 轉輪法 RR演算法 搶佔式
用於分時系統。每個程序都佔用一個時間片的時間。就緒佇列為FIFO迴圈佇列。如果一個程序的CPU區間長度小於時間片,則繼續下面的程序;如果大於時間片,則中斷切換到下一個程序執行。
通常時間片長度為10ms-100ms,由此需要確定時間片大小使得上下文切換次數適當少。 - 多級佇列排程
根據某種性質將一個就緒佇列分成不同的獨立佇列,如系統程序,互動程序(前臺程序),互動編輯程序,批處理程序,學生程序。
每個佇列都有不同的排程演算法。
每個佇列都有優先順序,比如前臺佇列就比後臺佇列要有絕對的優先順序,因此佇列間的分配方法:
- 優先順序排程演算法 pintos的優先順序是0-63 0為最低優先順序,63為最高優先順序
- 只有優先順序高的佇列為空,才能執行低優先順序佇列。
- 為佇列分配不同權重的CPU時間,優先順序高的分配時間多。
CPU排程例子
多級反饋佇列排程演算法(BSD 5.3)
- 設定多個就緒佇列,第一級佇列優先順序最高
- 給不同就緒佇列中的程序分配不同長度的時間片,隨著優先順序的降低逐漸增大
- 當第一級佇列為空時,在第二級佇列排程,以此類推
- 各級佇列按照時間片輪轉方式進行排程
- 當一個新建立程序就緒後,進入第一級佇列
- 如果程序因為用完時間片而放棄CPU,則進入下一級就緒佇列
- 如果程序因為阻塞而放棄CPU,則進入相應的等待佇列,等待事件發生後,該程序回到原來一級就緒佇列末尾(或隊首)
- 若允許搶佔,被搶佔程序回到原來一級就緒佇列末尾(或隊首)
基於優先順序的搶佔式多工排程(Windows)
- 排程單位是執行緒
- 採用基於優先順序的搶佔式排程,結合時間配額的調整
- 就緒執行緒按優先順序進入相應佇列
- 系統總是選擇優先順序最高的就緒執行緒執行
- 同一優先順序的各執行緒按時間片輪轉進行排程
- 多CPU系統中允許多個執行緒並行執行
參考資料
《作業系統概念》 第七版