作業系統核心原理 3 程序原理(中) 程序排程

2022-01-11 09:13:42 字數 3220 閱讀 2298

ps:在多程序併發的環境裡,雖然從概念上看,有多個程序在同時執行,但在單個cpu下,在任何時刻只能有乙個程序處於執行狀態,而其他程序則處於非執行狀態。那麼問題來了,我們是如何確定在任意時刻到底由哪個程序執行,哪些不執行呢?這就涉及到程序管理的乙個重要組成部分:程序排程,跟隨本篇來一起複習下程序排程吧!

程序排程是作業系統程序管理的乙個重要組成部分,其任務是選擇下乙個要執行的程序

首先,一般的程式任務分為三種:cpu計算密集型、io密集型與平衡(計算與io各半)型,對於不同型別的程式,排程需要達到的目的也有所不同。對於io密集型,響應時間最重要;對於cpu密集型,則周轉時間最重要;而對於平衡型,進行某種響應和周轉之間的平衡就顯得比較重要。

因此,程序排程的目標就是要達到極小化平均響應時間、極大化系統吞吐率、保持系統各個功能部件均處於繁忙狀態和提供某種貌似公平的機制

ps:為何說要保持系統各個功能部件均處於繁忙狀態?因為cpu非常昂貴,讓其閒置是一種浪費,因此保持cpu繁忙十分重要。就像生命也非常珍貴,我們只有乙隻保持學習保持充實的狀態,才算不浪費生命。

先來先服務(fcfs)演算法是一種最常見的演算法,它是人的本性中的一種公平觀念。其優點就是簡單且實現容易,缺點則是短的工作有可能變得很慢,因為其前面有很長的工作在執行,這樣就會造成使用者的互動式體驗也比較差。

例如排隊辦理業務時,你要辦理的業務只需要幾分鐘就可以辦好,但是你前面的乙個人辦理的事情很複雜需要1個小時,這時你需要在他後面等很久,於是你就想到:要是每個人輪流辦理10分鐘事務的話,那該多好!於是就出現了時間片輪轉演算法。

時間片輪轉是對fcfs演算法的一種改進,其主要目的是改善短程式的響應時間,實現方式就是周期性地進行程序切換。時間片輪轉的重點在於時間片的選擇,需要考慮多方因素:如果執行的程序多時,時間片就需要短一些;程序數量少時,時間片就可以適當長一些。因此,時間片的選擇是乙個綜合的考慮,權衡各方利益,進行適當折中。

但是,時間片輪轉的系統響應時間也不一定總是比fcfs的響應時間短。時間片輪轉是一種大鍋飯的做法,但是現實生活中卻是走的「一部分人先富,先富帶動後富」的路線。例如,如果有30個任務,其中乙個任務只需要1秒時間執行,而其他29個任務需要30秒鐘執行,如果因為某種原因,這個只要1秒鐘的任務排在另外29個任務的後面輪轉,則它需要等待29秒鐘才能執行(假定時間片為1秒)。於是,這個任務的響應時間和互動體驗就變得非常差。因此,短任務優先演算法被提出。

短任務優先演算法的核心是所有的任務並不都一樣,而是有優先順序的區分。具體來說,就是短任務的優先順序比長任務的高,而我們總是安排優先順序高的任務先執行

短任務優先演算法又分為兩種型別:一種是非搶占式,一種是搶占式。非搶占式當已經在cpu上執行的任務結束或阻塞時,從候選任務中選擇執行時間最短的程序來執行。而搶占式則是每增加乙個新的程序就需要對所有程序(包括正在cpu上執行的程序)進行檢查,誰的時間短就執行誰

由於短任務優先總是執行需要執行時間最短的程式,因此其系統平均響應時間在以上幾種演算法中是最優的,這也是短任務優先演算法的優點。但短任務優先演算法也有缺點:一是可能造成長任務無法得到cpu時間從而導致「肌餓」。二是如何知道每個程序還需要運轉多久?於是為了解決第乙個缺點,優先順序排程演算法被提出。而第二個缺點則可以採取一些啟發式的方法來進行估算,目前很多的人工智慧演算法都可以做這個事。

優先順序排程演算法給每個程序賦予乙個優先順序,每次需要程序切換時,找乙個優先順序最高的程序進行排程。這樣如果賦予長程序乙個高優先順序,則該程序就不會再「飢餓」。事實上,短任務優先演算法本身就是一種優先順序排程,只不過它給予短程序更高的優先順序而已。

該演算法的優點在於可以賦予重要的程序以高優先順序以確保重要任務能夠得到cpu時間,其缺點則有二:一是低優先順序的程序可能會「飢餓」,二是響應時間無法保證。第乙個缺點可以通過動態地調節任務的優先順序解決,例如乙個程序如果等待時間過長,其優先順序將因持續提公升而超越其他程序的優先順序,從而得到cpu時間。第二個缺點可以通過將乙個程序優先順序設定為最高來解決,但即使將優先順序設定為最高,但如果每個人都將自己的程序優先順序設定為最高,其響應時間還是無法保證。

之前的演算法都存在一定缺點,那麼可否有乙個演算法混合他們的優點,摒棄它們的缺點,這就是所謂的混合排程演算法。混合排程演算法將所有程序分為不同的大類,每個大類為乙個優先順序。如果兩個程序處於不同的大類,則處於高優先順序大類的程序優先執行;如果處於同乙個大類,則採用時間片輪轉演算法來執行。混合排程演算法的示意圖如下圖所示:

優先順序倒掛指的是乙個低優先順序任務持有乙個被高優先順序任務所需要的共享資源。這樣高優先順序任務因為資源缺乏而處於受阻狀態,一直到低優先順序任務釋放資源為止。這樣實際上造成了這兩個任務的優先順序倒掛。

(1)不持有資源的低優先順序程序阻礙需要資源的高優先順序程序的執行;

(2)持有資源的優先順序程序阻礙需要資源的高優先順序程序的執行;

(1)針對第一種形式,可以使用中斷禁止的方法,其核心是通過禁止中斷來保護臨界區。

(2)針對第二種形式,不能讓低優先順序程序持有高優先順序程序所需要的資源,則可以通過優先順序上限和優先順序繼承來實現。

優先順序倒掛問題,後面會詳細學習,到時再詳細說說。當然,欲知後事如何,請看下回分解

鄒恒明,《作業系統之哲學原理》,機械工業出版社

出處:

作業系統核心原理 3 程序原理(下) 程序通訊

程序作為人類的發明,自然也免不了脫離人類的習性,也有通訊的需求。如果程序之間不進行任何通訊,那麼程序所能完成的任務就要大打折扣。人類的通訊方式無外乎對白 通過聲音溝通 打手勢 寫信 發電報 擁抱等方法。同理,程序也可以通過同樣的方式來進行通訊。本篇我們就來看看程序的這些互動方式。人們最常用的通訊手段...

作業系統核心原理 3 程序原理(上) 程序概要

程序管理 記憶體管理和檔案管理是作業系統的三大核心功能,那麼什麼是程序呢?顧名思義,程序就是進展中的程式,或者說程序是執行中的程式。當乙個程式被載入到記憶體之後就變為了程序。因此,我們可以得到 程序 程式 執行。本篇將會對程序 程序模型 程序狀態以及程序的缺陷等進行學習,為後續學習程序排程與程序通訊...

作業系統核心原理 3 程序原理(上) 程序概要

程序管理 記憶體管理和檔案管理是作業系統的三大核心功能,那麼什麼是程序呢?顧名思義,程序就是進展中的程式,或者說程序是執行中的程式。當乙個程式被載入到記憶體之後就變為了程序。因此,我們可以得到 程序 程式 執行。本篇將會對程序 程序模型 程序狀態以及程序的缺陷等進行學習,為後續學習程序排程與程序通訊...