1. 程式人生 > >作業系統核心原理-3.程序原理(中):程序排程

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

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

一、程序排程基礎

1.1 程序排程定義

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

1.2 程序排程目標

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

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

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

二、基本排程演算法

2.1 先來先服務演算法

FCFS

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

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

2.2 時間片輪轉演算法

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

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

2.3 短任務優先演算法

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

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

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

2.4 優先順序排程演算法

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

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

2.5 混合排程演算法

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

2.5 程序排程的過程

三、排程異常之優先順序倒掛

3.1 何為優先順序倒掛

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

3.2 優先順序倒掛的表現形式

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

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

3.3 優先順序倒掛的預防辦法

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

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

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

  next chapter

參考資料

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

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

相關推薦

作業系統核心原理-3.程序原理程序排程

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

作業系統核心原理-5.記憶體管理分頁記憶體管理

  在上一篇介紹的幾種多道程式設計的記憶體管理模式中,以交換記憶體管理最為靈活和先進。但是這種策略也存在很多重大問題,而其中最重要的兩個問題就是空間浪費和程式大小受限。那麼有什麼辦法可以解決交換記憶體存在的這些問題呢?答案是分頁,它是我們解決交換缺陷的“不二法門”。 一、分頁記憶體管理 1.1 解決問題之

作業系統核心原理-3.程序原理程序通訊

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

作業系統核心原理-5.記憶體管理段式記憶體管理

一、分頁系統的缺點   分頁系統存在的一個無法容忍,同時也是分頁系統無法解決的一個缺點就是:一個程序只能佔有一個虛擬地址空間。在此種限制下,一個程式的大小至多隻能和虛擬空間一樣大,其所有內容都必須從這個共同的虛擬空間內分配。 二、分段管理系統 2.1 何為分段管理   分段管理就是將一個程式按照邏輯單

作業系統核心原理-5.記憶體管理基本記憶體管理

  作業系統的兩個角色分別是魔術師和管理者,在管理者這個角色中,除了CPU之外,記憶體是作業系統要管理的另外一個重要資源。記憶體管理需要達到兩個目標:一是地址保護,即一個程式不能訪問另一個程式的地址空間。二是地址獨立,即程式發出的地址應該與物理主存地址無關。這兩個目標就是衡量一個記憶體管理系統是否完善的標準,

每天3分鐘作業系統修煉祕籍17程序間通訊(3)套接字

點我檢視祕籍連載 套接字 套接字(Socket)用於協調不同計算機上的程序間通訊,也就是基於網路的通訊。當然,也可以在本機上使用套接字進行程序間的通訊。 套接字通訊的方式非常多,有Unix域套接字、TCP套接字、UDP套接字、鏈路層套接字等等。但最常用的肯定是TCP套接字。所以,這裡介紹下TCP Socket

每天3分鐘作業系統修煉祕籍24程序狀態以及狀態轉換

點我檢視祕籍連載 程序狀態以及狀態轉換 程序並非總是處於執行中,例如CPU沒執行在它身上時它就是非執行的。程序在建立之後會改變狀態,不同的狀態之間可以實現狀態切換,可以通過ps或top等命令捕獲程序的狀態。包含以下幾種狀態: 建立態(new):程序正在被建立中,過程非常短暫,使用者無法捕捉 執行態(run

每天3分鐘作業系統修煉祕籍25程序排程演算法圖解說明

點我檢視祕籍連載 程序排程 在這裡簡單介紹一些程序排程相關的演算法策略,雖然瞭解這些對於使用Linux來說不會有很大幫助,但是卻能幫助我們瞭解程序排程追求的是什麼,它和生活中的很多案例都類似。 程序排程的兩個關鍵性指標是:響應時間和週轉時間。 響應時間:程序未執行到下次被選中執行的時間間隔。例如程序剛被建立

Spring原始碼解析--《SPRING技術內幕:深入解析Spring架構與設計原理》讀書筆記IOC容器初始化過程

通過閱讀相關章節內容,Spring中IOC容器的載入中,我們需要了解下列幾個概念: Resource:是一個定位、訪問資源的抽象介面,包含了多種資源操作的基礎方法定義,如getInputStream()、exists()、isOpen()、getD

SVM全系列原理到python實現SVM原理

前言 本文開始主要介紹一下SVM的分類原理以及SVM的數學匯出和SVM在Python上的實現。借鑑了許多文章,會在後面一一指出,如果有什麼不對的希望能指正。 一、 SVM簡介 首先看到SVM是在斯坦福的機器學習課程上,SVM是作為分類器在logisticregr

Android系統原理與原始碼分析1利用Java反射技術阻止通過按鈕關閉對話方塊

本文為原創,如需轉載,請註明作者和出處,謝謝!     眾所周知,AlertDialog類用於顯示對話方塊。關於AlertDialog的基本用法在這裡就不詳細介紹了,網上有很多,讀者可以自己搜尋。那

Linux核心分析程序的描述和程序的建立

一、Linux中的程序簡析 程序是具有多道程式設計的作業系統的基本概念,關於程序的定義就是程式執行的一個例項,也是系統資源排程的最小單位。如果同一個程式被多個使用者同時執行,那麼這個程式就有多個相對獨立的程序,與此同時他們又共享相同的執行程式碼。在Li

作業系統真象還原》-閱讀筆記

第七章 作業系統是由中斷驅動的。 中斷分為外部中斷和內部中斷。 外部中斷分為可遮蔽中斷和不可遮蔽中斷,內部中斷分為軟中斷和異常。 外部中斷 來自CPU外部的中斷。 可遮蔽中斷:通過INTR引腳進入CPU,外部裝置如硬碟、網絡卡、印表機等發出的中斷

我是如何學習寫一個作業系統程序排程

前言 既然引進了多程序,其實也就是在程序之間來回切換,那麼就會有程序之間的排程問題。實則是在可執行程序之間分配有限的處理器時間資源的核心子系統。 幾個簡單的CPU排程演算法 First Come, First Served(FCFS) 其實就是一個先進先出隊列了,也就是說先申請的程序,先執行。當CPU空閒

我是如何學習寫一個作業系統程序的同步與訊號量

前言 在多程序的執行環境下,程序是併發執行的,不同程序間存在著不同的相互制約關係。為了協調程序之間的相互制約關係,達到資源共享和程序協作,避免程序之間的衝突,引入了程序同步的概念。 臨界資源 多個程序可以共享系統中的各種資源,但其中許多資源一次只能為一個程序所使用,我們把一次只允許一個程序使用的資源成為臨界資

樹莓派3學習筆記77寸分辨率800 480顯示器配置

樹莓派、顯示器配置樹莓派3學習筆記(7):7寸(分辨率800 480)顯示器配置 樹莓派搭載分辨率為800X480的顯示器在顯示的時候可能會遇到無法全屏顯示的問題, 顯示器只有部分能夠顯示,有一部分是黑邊,對於這一種情況,我們只需進入系統的boot目錄,找到config.txt文件,或者直接在命

程序學習程序邏輯層之註冊頁面

其他 nor stop 默認 pat 標題 pre 開啟 開始 小程序學習(四)小程序邏輯層之註冊頁面 註冊頁面(Page) 小程序頁面的註冊,是通過 Page() 函數來完成的。接受一個 object 參數,指定頁面的初始數據,生命周期、事件處理函數等。 object

淺談線程池獨立線程池的作用及IO線程池

關於 線程數 客戶端 pool 網絡 程序 服務器 缺點 public 在上一篇文章中,我們簡單討論了線程池的作用,以及CLR線程池的一些特性。不過關於線程池的基本概念還沒有結束,這次我們再來補充一些必要的信息,有助於我們在程序中選擇合適的使用方式。 獨立線程池 上次我們討

PHP面試程序設計、框架基礎知識、算法與數據結構、高並發解決方案類

表設計 工作原理 結構 單一入口 php 能力 高並發解決方案 數據表 缺點 一、程序設計 1、設計功能系統——數據表設計、數據表創建語句、連接數據庫的方式、編碼能力 二、框架基礎知識 1、MVC框架基本原理——原理、常見框架、單一入口的工作原理、模板引擎的理解 2、常見框

程序實踐動態控制組件的顯示/隱藏

-s -- hid 控制 alt 實踐 als nbsp 小程序 組件有個屬性:hidden=‘‘ ,值為true/false ,當false的時候說明不隱藏,當true的時候說明隱藏,註意該隱藏是不保留組件位置的。 實現即 .js 配合.wxml 文件 一、在.j