第五章-----程式排程

飄過的小熊發表於2016-09-04

第五章—–程式排程

標籤(空格分隔): 作業系統之哲學原理



程式排程的定義

在多個程式併發的環境中,我們如何確定在任意時刻由哪個程式執行,哪個程式不執行?如何進行金成德排程尼

一般來說,程式使用CPU的模式有三種:

  • 一種是大部分時間在CPU上執行

    • 稱為CPU導向(CPU_bound)或計算密集型程式:宇宙大爆炸各宗引數的程式,矩陣乘法程式
  • 一種是大部分時間進行輸入輸出

    • IO導向(IO_bound) 或輸入輸出mi’ji’xin:人機互動,遊戲程式
  • 一種是介於前兩種模式之間

    • 平衡型程式:網路瀏覽或者下載,網路視訊

程式排程的目標

目標:極小化平均響應時間,極大化系統吞吐率,保持系統各個功能部件均處於繁忙狀態和提供某種貌似公平的機制

當然對於不同的系統,在程式排程上的目標是不同的。批處理系統就不太在意響應時間,但是系統吞吐率,CPU利用率和週轉時間很重要。互動式系統就需要響應時間夠快。

這裡有個術語就是適度性,例如,使用者期待的是1秒的響應時間,那麼我們就做1秒,不必提供0.1秒的響應時間,因為這意味著時間越短,設計與實現就會越複雜,然而時間優化並不會提高使用者的滿意度,相對於人來說,1秒和0.1秒的差別對比意義不是那麼明顯。


先來先服務排程演算法(First Come First Serve)FCFS

簡單來說就是先來先到,排隊買包子,但是每個人買的包子數量不同,買的時候消耗時間的屬性不同。
自然這種最初級的排程演算法有很大的弊端,CPU利用率低下,響應時間也不高。於是想到了時間輪轉演算法。


時間片輪轉演算法

這個演算法是對FCFS演算法的一種改進,主要目的是改善短程式的響應時間,方法就是進行週期性的切換。每個人只能有五分鐘的時間使用公共廁所,這五分鐘不能被外界打擾,即使你早早結束,也要呆在裡面等時間到。當然,時間片的選擇很是重要,大多數人上廁所用不到五分鐘。
系統響應時間依賴於時間片的選擇。我們把時間片選大點,發現後來就變成了FCFS演算法了,真是,。,。一家親。這還不算啥,時間片選得過短也不行,因為程式切換需要消耗。規定上廁所時間為30秒,褲子都沒脫就結束了也不行。

如何來選擇合適的時間片?

需要知道進行一次程式切換的消耗和我們能夠承受的整個系統的消耗。就可以得出合適的時間片。吃飯是要花錢的,當然吃肉的花銷很大,要是你能經受得住,可以選擇吃肉。
還要考慮的是,有多少程式在系統裡執行,程式多就把時間片選短一點,程式少,長一點也無所謂。


短任務優先演算法(Shorted Time to Completion First) SCTF

人們在一直的探索更好的排程,發現時間片輪轉的演算法也是有問題的。例如,一個任務只要使用CPU1s,相對其他的任務算是比較短了,但是由於時間片的種種原因,被輪到了最後一個,這樣,系統的排程就可以有進一步的優化空間。於是乾脆,所有短的任務全都優先執行。長得矮的站前面。

有兩種模式

搶佔與非搶佔是對於CPU上的程式來說的

  • 搶佔
    • 每增加一個新程式就要對所有程式(包括在CPU上的)進行檢查,誰的時間短就執行誰
    • 在所有的搶佔式演算法中,搶佔式SCTF演算法最優
  • 非搶佔
    • 讓已經在CPU上的程式執行到結束或者阻塞的狀態,在所有餓的候選程式中選擇時間最短的來執行
    • 在所有的非搶佔式演算法中,SCTF演算法最優

後來人們發現這種短任務優先也有缺點,

  • 長時間任務無法得到CPU時間而處於飢餓狀態。
  • 我們不知道每個程式要執行多久(注意是還要,就是說已經在執行了,不知道到技術還有多久,不是說的整個程式的執行時間
    解決第二問題有兩種思路,第一種是根據程式大小來推測,不可取。第二種思路是先將每個程式執行一遍。記錄所用的時間,在以後的執行中根據實測的資料來定位。

優先順序排程演算法

既然短任務優先有缺點,我們就來改進。不能再懶了,使用手動的辦法給不同的任務設定不同的優先順序,打破公平原則。我們可給重要的程式很高的優先順序,讓它先執行。但是,。,。低優先順序的任務有可能出現飢餓。可是我們有辦法呀,只要動態的調節優先順序就好了,一個程式執行了特定的時間後,將優先順序降低,或者將等待的程式優先順序提高

這種演算法還有一個缺點就是響應時間無法得到保證,因為程式的執行預先是不知道順序的,也就無法估算時間。


混合排程演算法

和快取的組相聯還是什麼的有點類似,先將所有程式分成不同的大類,每個大類有不同的優先順序,在每個大類裡面使用時間片輪轉,簡直完美


其他排程演算法

  • 保證排程
  • 彩票排程
  • 使用者公平排程

保障排程

樹上的解釋是看的一愣一愣的,首先保障排程和時間輪轉的任務一樣,給每個任務一定的時間。但是保障排程可以和短任務優先一起用。大概就是這個意思,雖然沒有多大的意義。保障排程不一定要輪轉,可以按照優先順序來呀,只是規定每個任務的可使用CPU時間是一樣的

彩票排程

首先彩票排程是一種概率排程,這就很不得了。我給你一種虛擬的優先順序,看上去你的優先順序很大,但是隻是概率。在每一次的排程切換中,每個程式都有機會。我想讓某個程式先執行,多發幾張彩票,概率就比較大了。當然我得給每個程式都至少發一張彩票保證不會有程式會出現飢餓。真是一種敷衍的好套路,於是要是每個程式的彩票一樣多就成了保障排程,如果給短任務更多的彩票就成了短任務優先排程。

使用者公平排程

前面講的排程演算法都是以程式為單位。但是有的使用者無聊,通過啟動多個程式來霸佔CPU,簡直是無聊至極。於是就有了使用者程式排程,給每個使用者進行分配,要是使用者的程式多久多分點。

由於不同的作業系統的目標不同,不同的程式的性質和重要性不同,程式排程也就不同


實時排程演算法

實時系統前面提到過,是需要提供時序可預測性的系統。排程演算法是別處一格。前面的演算法主要考慮的是平均響應時間和系統吞吐率,而實時系統必須考慮每個具體任務的響應時間必須符合要求,必須在規定的時間內完成,無需考慮如何降低系統的響應時間或吞吐率。

實時排程演算法最經典兩種:

  • EDF ,動態優先順序排程優先,又稱最早截止任務優先(Endliest Dealine First)
  • RMS,靜態優先順序排程,又稱最短周琦優先(Rate Monotonic Scheduling,RMS)

EDF

EDF:最早截止的任務先做
如果將SCTF演算法的任務所需時間變為截止時間,則搶佔式SCTF就是EDF排程演算法

RMS

雖然EDF在理論上是最優的,但是動態計算和動態搶佔CPU均要消耗系統資源。於是考慮在進行排程前先計算出優先順序,按照優先順序來進行排程。不接受新的程式,也不進行優先順序的調整


程式排程的過程

  • 因時序或外部中斷或程式掛起而導致作業系統獲得CPU控制權
  • 作業系統在所有就緒的程式中按照某種演算法邏輯遴選程式
  • 如果選中的是非當前程式,則作業系統將當前程式(中斷或掛起的程式)狀態進行保護
  • 將選中的程式的環境佈置好(設定寄存我i,棧指標,狀態字等)
  • 跳轉到選中的程式

高階議題:排程異常之優先順序倒掛

優先順序倒掛是怎麼形成的尼?

一個低階優先順序任務持有一個被高優先順序認為所需要的共享資源。高優先順序任務因資源缺乏而處於受阻狀態,一直到低優先順序任務釋放資源為止。這樣實際上是造成了兩個任務的優先順序倒掛。中優先順序的任務就可以先於高優先順序執行,高優先順序程式被臨界區外的低優先順序程式阻塞。

危害:

  • 如果一個高優先順序程式一直不能獲取資源,可能造成系統故障或激發事先定義的糾正措施
  • 如果高優先順序程式在等待資源時不時阻塞等待,而是迴圈(繁忙)等待,則它將永遠無法獲得所需資源。
  • 造成系統的效能降低

倒掛的解決方案

優先順序倒掛兩種形式:
- 不持有資源的低優先順序程式阻礙需要資源的高優先順序程式的執行
- 持有資源的低優先順序程式阻礙需要資源的高優先順序程式的執行

解決辦法:

  • 使用中斷禁止
  • 優先順序上限
  • 優先順序繼承

國際慣例

在計算程式的響應時間的時候一定要記住,程式的時間是包括IO的,只是在計算CPU的時候不用包括IO

相關文章