1. 程式人生 > >【作業系統】unix 程序排程策略

【作業系統】unix 程序排程策略

這一週為了準備OS課程的Seminar而去研究了一下Unix的程序排程,從網上的資料和我查閱的紙質資料上看,研究System V的比較多,所以我就拿System V來做例子。

需要注意的一點是,System V第一個版本是1983年釋出的,Sytem V Release 4(1988)最成功的一個版本,離現在也有點久遠了,*nix各種分支進化到現在和80年代比應該發生了比較大的變化,但是它們的設計思想還是值得研究一番的。

Unix啟動過程

Alt text

  • 載入程式自舉
  • 載入程式完成後,系統控制權轉移給Unix核心,Unix OS正式開始工作
  • 核心建立0號程序
  • 0號程序建立1號程序init,並將控制權交給init
  • init查詢當前存在的終端數,為每一個終端建立一個新的管理程序
  • 管理程序等待使用者登入
  • 使用者登入後,系統為每一個使用者啟動一個shell程序
  • 使用者輸入命令,由shell程序建立新的程序

Unix程序上下文結構

  • proc結構:常駐記憶體,記錄了程序的基本資訊。
  • user結構:不常駐記憶體,在程序執行時調入記憶體,記錄了記憶體的私有資訊和資料。
  • 正文段:程式程式碼和常量,可被多個程序訪問的共享區域。
  • 資料段:程序的私有資訊,使用者態程序訪問的區域。
  • 系統棧:程序在系統態執行時完成子程式巢狀和中斷處理時使用的資訊保留區,只能被系統態程序使用。
  • 使用者棧:程序在使用者態執行時完成子程式巢狀和中斷處理時使用的資訊保留區。

0號程序三大任務

  • 由核心程式建立,在初始化時完成1號程序的創立
  • 在以後的管理中,負責程序的排程與分配
  • 在以後的管理中,負責程序的內外存交換

Unix程序狀態轉換圖

Alt text

使用者態和系統態的切換

Alt text
PSW:處理器狀態暫存器:反映了當前執行程序的訪問方式,比如程序在何種狀態下執行、中斷的優先順序的狀態是怎樣的、進入中斷或陷入指令之前處理器的執行方式是怎樣的等等。

程序排程程式(0號程序的switch程式)

  • 對參與競爭CPU且已具備執行條件的程序進行分析和裁決
  • 對選中的程序做處理器控制權移交
  • 管理程序執行中各種狀態的轉換
  • 完成程序在系統內外存之間的交換

排程演算法

動態優先順序多級反饋迴圈排程法(Round Robin With Multilevel Feedback)

  1. 當一個時間片結束時,系統為所有程序計算優先順序
  2. 計算後檢視是否有優先順序高於當前程序且處於“記憶體就緒”的程序,將它們選出
  3. 將選出的程序設定排程標誌
  4. 下一輪排程開始時,排程已設定了高優先順序排程標誌且優先順序最高的程序,讓其在處理器中開始執行

優先數計算

Unix是根據優先數來判斷程序排程優先順序的。
優先數是程序的proc結構中的char p_pri欄位,值的範圍是0-127,優先數越小,優先順序越高。
0-49之間的優先數是系統態程序的優先順序,使用者態下的程序優先順序為50-127之間。

計算公式

p_pri = p_cpu / 2 + PUSER + p_nice + NZERO

  • PUSER和NZERO是基本使用者優先數的閾值,是系統預設的,分別是25和20
  • p_cpu表示該程序最近一次佔用CPU的時間,對於當前程序,每個時鐘中斷(注意不是每個時間片)該值加1(最大值80)。若時鐘中斷週期是16.6ms,則一秒內右60個時鐘中斷
  • 新建立程序的p_cpu為0
  • p_nice是使用者可以通過系統呼叫設定的一個優先順序偏移值,預設為20。超級使用者可以設定其在0到39之間,而普通使用者只能增大該值

一個時間片結束後,系統將每個程序的p_cpu除以2,這個過程稱為衰減。
衰減過後,系統重新計算每個程序的p_pri

分析一下這條公式,系統執行時PUSER和NZERO是常數,而p_nice一般也是一個常數,所以程序優先數就取決於p_cpu。對於那些佔用CPU較長時間的程序,其優先數在衰減後還是比那些最近佔用CPU較短的程序大,所以其優先順序會變小,反過來,那些不怎麼佔用CPU的程序的優先順序會增加,所以會在下一次排程中被執行。這是一種負反饋調節。

優先數0-49是核心保留的優先數,當程序睡眠(阻塞)時,就會被賦予一個系統優先順序(0-49),由於比使用者優先數小,所以這些程序醒來的時候(比如IO完成)能被及時處理。

排程時機的疑問

關於排程時機,是讓我比較疑惑的一點,我手上的中文教材和網上的一個課件說的都是排程時機有以下兩個:

  • 第一種情況:當程序執行中自動放棄處理機時(比如等待I/O,或者執行結束),進行一次程序排程
  • 第二種情況:當程序由系統態轉入使用者態時,系統安排一次排程,這樣做的意圖是使那些被設定了高優先順序排程標誌,並且在記憶體中就緒的程序可以有機會搶先進入執行狀態

然而在查到的外文資料裡沒有提到“排程時機”。

如果是以上兩個排程時機,那麼說明在時間片結束的時候可能沒有排程發生,因為只是發生了優先數計算,那麼假設有一個使用者態程序在執行過程中進行了大量計算(或者死迴圈),既沒有主動放棄處理機,也沒有從系統態到使用者態的轉換,那麼處理機就一直被它佔用。

0號程序一直是系統態,如果0號程序在時間片結束、計算完優先數並設定標記以後,讓之前的使用者程序繼續執行,是否算是一種“系統態到使用者態的轉換”?如果是,那麼就出現了排程時機,這種時機的安排就是有效的。

雖然有這個疑問,不過排程的主要思想我已經理解,也許後面的學習中這些疑問都會被解決。

參考資料