1. 程式人生 > >作業系統CPU排程

作業系統CPU排程

概述

多道程式作業系統的基礎。通過在程序之間切換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)

排程演算法

各種排程演算法:

image

多處理器排程:

  • 需要決定在哪一個CPU上執行
  • 要考慮程序在多個CPU之間遷移的開銷(快取記憶體失效,TLB失效),儘可能使CPU總在同一個程序上執行
  • 要考慮負載均衡問題

    1. FCFS 先到先服務
      一旦選定程序,那麼在結束之前就不能再切換到另一個程序。
    2. SJF 最短優先 精確的講是最短下一個CPU區間的演算法
      前面提到,一個程序是由CPU區間和I/O區間交替組成的。而SJF是看哪個程序的CPU區間最短。
  • SRTF搶佔式:又稱最短剩餘優先,當新進來的程序的CPU區間比當前執行的程序所剩的CPU區間短,則搶佔。
  • 非搶佔:稱為下一個最短優先,因為在就緒佇列中選擇最短CPU區間的程序放在隊頭。
    SJF用於長期排程而不能用短期排程,因為程序是一個整體,CPU沒法知道程序中第一個CPU區間長度。
    SJF需要確定下一個CPU區間的時間長度,可以通過近似估算出下一個CPU區間的長度,比如tn+1=atn+(1-a)rn tn為最近最近一次的CPU時間,rn為歷史記錄。a是給定的權重。
    1. 優先順序排程演算法 pintos的優先順序是0-63 0為最低優先順序,63為最高優先順序
      SJF是特殊的優先順序排程演算法,以CPU區間長度的倒數為優先順序。
      (1)內部優先順序:通過內部資料比如記憶體要求等。
      (2)外部優先順序:使用者自己設定。set_priority
      分為搶佔式和非搶佔式,前者為如果進來的程序優先順序高於執行的程序,則替換;後者只是在就緒佇列中按優先順序排隊。
      缺點:無線阻塞或飢餓。前者為一個優先順序高且執行時間長的程序一直阻塞,後者為優先順序低的程序永遠都得不到執行。
      解決飢餓的方法是老化。通過每個時間間隔後將等待的程序優先順序降低。
    2. 轉輪法 RR演算法 搶佔式
      用於分時系統。每個程序都佔用一個時間片的時間。就緒佇列為FIFO迴圈佇列。如果一個程序的CPU區間長度小於時間片,則繼續下面的程序;如果大於時間片,則中斷切換到下一個程序執行。
      通常時間片長度為10ms-100ms,由此需要確定時間片大小使得上下文切換次數適當少。
    3. 多級佇列排程
      根據某種性質將一個就緒佇列分成不同的獨立佇列,如系統程序,互動程序(前臺程序),互動編輯程序,批處理程序,學生程序。
      每個佇列都有不同的排程演算法。
      每個佇列都有優先順序,比如前臺佇列就比後臺佇列要有絕對的優先順序,因此佇列間的分配方法:
  • 只有優先順序高的佇列為空,才能執行低優先順序佇列。
  • 為佇列分配不同權重的CPU時間,優先順序高的分配時間多。

CPU排程例子

  1. 多級反饋佇列排程演算法(BSD 5.3)

    • 設定多個就緒佇列,第一級佇列優先順序最高
    • 給不同就緒佇列中的程序分配不同長度的時間片,隨著優先順序的降低逐漸增大
    • 當第一級佇列為空時,在第二級佇列排程,以此類推
    • 各級佇列按照時間片輪轉方式進行排程
    • 當一個新建立程序就緒後,進入第一級佇列
    • 如果程序因為用完時間片而放棄CPU,則進入下一級就緒佇列
    • 如果程序因為阻塞而放棄CPU,則進入相應的等待佇列,等待事件發生後,該程序回到原來一級就緒佇列末尾(或隊首)
    • 若允許搶佔,被搶佔程序回到原來一級就緒佇列末尾(或隊首)
  2. 基於優先順序的搶佔式多工排程(Windows)

    • 排程單位是執行緒
    • 採用基於優先順序的搶佔式排程,結合時間配額的調整
    • 就緒執行緒按優先順序進入相應佇列
    • 系統總是選擇優先順序最高的就緒執行緒執行
    • 同一優先順序的各執行緒按時間片輪轉進行排程
    • 多CPU系統中允許多個執行緒並行執行

參考資料

《作業系統概念》 第七版