【作業系統】unix 程序排程策略
這一週為了準備OS課程的Seminar而去研究了一下Unix的程序排程,從網上的資料和我查閱的紙質資料上看,研究System V的比較多,所以我就拿System V來做例子。
需要注意的一點是,System V第一個版本是1983年釋出的,Sytem V Release 4(1988)最成功的一個版本,離現在也有點久遠了,*nix各種分支進化到現在和80年代比應該發生了比較大的變化,但是它們的設計思想還是值得研究一番的。
Unix啟動過程
- 載入程式自舉
- 載入程式完成後,系統控制權轉移給Unix核心,Unix OS正式開始工作
- 核心建立0號程序
- 0號程序建立1號程序init,並將控制權交給init
- init查詢當前存在的終端數,為每一個終端建立一個新的管理程序
- 管理程序等待使用者登入
- 使用者登入後,系統為每一個使用者啟動一個shell程序
- 使用者輸入命令,由shell程序建立新的程序
Unix程序上下文結構
- proc結構:常駐記憶體,記錄了程序的基本資訊。
- user結構:不常駐記憶體,在程序執行時調入記憶體,記錄了記憶體的私有資訊和資料。
- 正文段:程式程式碼和常量,可被多個程序訪問的共享區域。
- 資料段:程序的私有資訊,使用者態程序訪問的區域。
- 系統棧:程序在
系統態
執行時完成子程式巢狀和中斷處理時使用的資訊保留區,只能被系統態程序使用。 - 使用者棧:程序在
使用者態
執行時完成子程式巢狀和中斷處理時使用的資訊保留區。
0號程序三大任務
- 由核心程式建立,在初始化時完成1號程序的創立
- 在以後的管理中,負責程序的排程與分配
- 在以後的管理中,負責程序的內外存交換
Unix程序狀態轉換圖
使用者態和系統態的切換
PSW:處理器狀態暫存器:反映了當前執行程序的訪問方式,比如程序在何種狀態下執行、中斷的優先順序的狀態是怎樣的、進入中斷或陷入指令之前處理器的執行方式是怎樣的等等。
程序排程程式(0號程序的switch程式)
- 對參與競爭CPU且已具備執行條件的程序進行分析和裁決
- 對選中的程序做處理器控制權移交
- 管理程序執行中各種狀態的轉換
- 完成程序在系統內外存之間的交換
排程演算法
動態優先順序多級反饋迴圈排程法(Round Robin With Multilevel Feedback)
- 當一個時間片結束時,系統為所有程序計算優先順序
- 計算後檢視是否有優先順序高於當前程序且處於“記憶體就緒”的程序,將它們選出
- 將選出的程序設定排程標誌
- 下一輪排程開始時,排程已設定了高優先順序排程標誌且優先順序最高的程序,讓其在處理器中開始執行
優先數計算
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號程序在時間片結束、計算完優先數並設定標記以後,讓之前的使用者程序繼續執行,是否算是一種“系統態到使用者態的轉換”?如果是,那麼就出現了排程時機,這種時機的安排就是有效的。
雖然有這個疑問,不過排程的主要思想我已經理解,也許後面的學習中這些疑問都會被解決。
參考資料