時至今日,我認為system v的程序排程器設計得是十分精妙的,這個排程器可能直接影響到後來的windows nt系統。
簡單說system v的排程器是基於多級反饋優先順序佇列的,每個程序在乙個優先順序佇列被排隊,然後可能在某些時間點被反饋到別的優先順序佇列,排程動作很簡單,就是從最高優先順序佇列取出乙個程序,然後將當前程序反饋到乙個優先順序佇列,隨著進行的是程序切換。排程器的關鍵點有二:1.如何排隊;2.如何反饋。
system v認為系統內部的執行緒本身在地位上就是不平等的,你不能把等待磁碟io的任務和沒啥事在計算i++的程序等同起來,如果說有兩個相同的任務,顯然它們的 優先順序也相等,但是乙個任務非常不巧的要等待磁碟io,而另乙個任務在執行i++(因為任務是相同的,它一會也要執行磁碟io,但是不是現在),那麼這時 它們的優先順序還能相等嗎?system v認為不能,但是它們一開始的優先順序確實是相等的啊!這就是system v中一切程序的優先順序是一直在動態調整的,關鍵看當前執行的什麼性質的任務,這只是「動態調整」的意義之一,「動態調整」的另一半就是無論如何,優先順序隨 著時間的流逝也會調整的,即使該程序執行的任務性質沒有變化,舉個例子就是說,如果乙個程序在3秒內一直執行i++,那麼第乙個一秒和第二個一秒以及第三 個一秒,這個程序的優先順序是不同的。
定量的說一下,乙個程序的優先順序公式就是:
0.cpu = cpu +1;
1.cpu = cpu/2;
2.priority = (cpu/2) + base level priority;
其 中,cpu指的是乙個程序最近使用的cpu時間,每次時鐘中斷執行程序的cpu時間都會加1,正如式子0所示,那麼式子1是什麼時候計算的呢,在 system v中這是乙個定量的測量時間,被規定為1秒,每次過了1秒,核心的時鐘處理或其他地方會執行式子1,這裡的cpu變數當然是當前程序的cpu變數。至於式子2的執行時刻,和式子1是一樣的,只不過就不是調整乙個當前程序的優先順序了,而是所有使用者態程序的優先順序,至於核心態的優先順序,簡單說有兩種,執行在核心態的程序要麼不阻塞,要麼阻塞,不阻塞的情況下,其優先順序還是用使用者態優先順序,阻塞的情況下,解除阻塞時該程序的優先順序和阻塞的原因相關聯,也即是說, 如果乙個程序因為磁碟io被阻塞了,那麼它被喚醒時被賦予的優先順序就比因為等待緩衝區被阻塞的程序被喚醒時賦予的優先順序要高,這是確定的,從最高到低的睡眠優先順序分別為:
3.對換-->等待磁碟io-->等待緩衝區-->等待索引節點-->等待tty輸入-->等待tty輸出-->等待子程序退出....
如果乙個程序由於一定原因睡眠了,那麼根據這個原因在它被喚醒的時候就被賦予了不同的優先順序然後一直執行下去,直到乙個策略點。這個策略點不同的核心可以有不同的實現,在非搶占核心,這個策略點可能就是這個程序返回使用者空間的前夕,而在搶占式核心,這個策略點就是隨便乙個高優先順序程序就緒或者就是該程序的 時間片用盡。在這個策略點上,搶占將發生。
只要乙個使用者程序在執行,那麼它的cpu變數就會增加,這樣在核心計算上面式子2的時候,該增量就會被加到程序的優先順序上,從而使得程序優先順序降低而被搶 佔,但是不能這麼無情,比如n秒以前的cpu計時變數不應該這麼無情的增加到當前,那麼就出現了乙個衰減函式,該衰減函式就是式子1。
我們可以看到式子0,1,2以及序列3實際上都是具體的策略,而機制就是1.優先順序和睡眠原因的聯絡;2.優先順序的動態反饋調整。機制1保證了一些任務的 緊急性以及事實上的優先順序,機制2保證了使用者程序的公平,實際上機制2可以不用任何時間片的概念就可以做到公平排程,當今linux核心的cfs排程器就 是沒有時間片的概念,而windows nt核心使用的也是動態優先順序調整的機制,它的核心還有中斷請求級的概念,包括當今solaris核心的中斷優先順序的概念,是不是也是和system v的強大排程器關係很曖昧呢?
從古老的System V程序排程器說開去
時至今日,我認為system v 的程序排程器設計得是十分精妙的,這個排程器可能直接影響到後來的windows nt 系統。簡單說system v 的排程器是基於多級反饋優先順序佇列的,每個程序在乙個優先順序佇列被排隊,然後可能在某些時間點被反饋到別的優先順序佇列,排程動作很簡單,就是從最高優先 級...
程序排程 模擬程序排程的過程
通過這次實驗,理解程序排程的過程,進一步掌握程序狀態的轉變 程序排程的策略,進一步體會多道程式併發執行的特點,並分析具體的排程演算法的特點,掌握對系統效能的評價方法。編寫程式模擬實現程序的輪轉法排程過程,模擬程式只對pcb進行相應的排程模擬操作,不需要實際程式。假設初始狀態為 有n個程序處於就緒狀態...
程序的排程
在我的作業系統還未進入程序之前,應該好好學習一下程序的排程。下面就來討論一下。1 先來先服務 fcfs 顧名思意,就是嚴格按照程序在佇列中的順序依次執行。沒有太多可說的。2 迴圈法 round robin 基本思想是讓每個程序在就緒佇列中的等待時間與享受服務的時間成比例。基本概念是將cpu的處理時間...