1. 程式人生 > >操作系統精髓與設計原理------調度概述

操作系統精髓與設計原理------調度概述

而在 約束 可靠性 關系 理解 負責 能夠 先進先出 之間

前言:操作系統必須為多個進程之間可能有競爭關系的請求分配計算機資源。對處理器而言,可分配的資源是處理器上的執行時間,分配的途徑是“調度”。調度功能必須設計成可以滿足多個目標,包括公平、任何進程都不會產生饑餓、有效的使用處理器時間以及較低的開銷,此外,調度中還需要考量優先級和實時期限方面。從根本上說,調度是屬於隊列管理,用來在排隊環境中減少延遲和優化性能。(只記錄了一些基本概念,細節還要回顧書)

一、調度類型

長程調度:決定加入到待執行的進程池中。

中程調度:決定加入到部分或全部在內存中的進程集合中。

短程調度:決定哪一個可運行的進程將被處理器執行。

I/O調度:決定哪一個進程掛起的I/O請求將被可用的I/O設備處理。

調度類型和進程狀態轉換可通過如下圖理解:

技術分享

從用戶角度看,響應時間通常是系統最重要的一個特性;
從系統角度看,吞吐量或處理器利用率是最重要的。
在處理器的長程、中程、短程調度中,長程調度確定何時允許一個新進程進入系統;中程調度確定何時把一個程序的部分或全部取進內存,使得該程序能夠被執行;短程調度確定哪一個就緒進程下一次被處理器執行。

二、調度算法

以上類型的調度中,短程調度是執行的最頻繁的,也是最重要的,為所有就緒進程的短程調度決策算法大概有:
1、先來先服務:選擇等待服務時間最長的進程。
2、輪轉:使用時間片限制任何正在運行的進程只能使用一段處理器時間,並在所有就緒進程中輪轉。


3、最短進程優先:選擇預期處理時間最短的進程,並且不搶占該進程。
4、最短剩余時間:選擇預期的剩余處理時間最短的進程。當另一個進程就緒時,這個進程可能會被搶占。
5、最高響應比優先:調度決策基於對歸一化周轉時間的估計。
6、反饋:建立一組調度隊列,基於每個進程的執行歷史和其他一些準則,把它們分配到各個隊列中。
註意:具體的調度算法的選擇取決於預期的性能和實現的復雜度。

三、多處理器調度

1、分類

(1)松耦合、分布式多處理器、集群
(2)專門功能的處理器
(3)緊耦合多處理器

2、粒度

根據粒度的不同,區分5類並行度:

細:單指令流中固有的並行。

中等:在一個單獨應用中的並行處理或多任務處理。(可以理解為多線程並行,重點研究)

:在多道程序環境中並發進程的多處理。(多進程並發)

非常粗:在網絡節點上進行分布處理,以形成一個計算環境。(集群中的並行)

無約束:進程間沒有顯式的同步,多個無關進程。

3、線程調度(中等粒度)

在單處理器中,線程可以用作輔助構造程序,並在處理過程中重疊執行I/O,並且進行線程切換時的系統開銷遠遠小於進程切換的系統開銷;而在多處理器中,線程可以用於開發應用程序中真正的並行性。如果一個應用程序的各個線程同時在各個獨立的處理器中執行,其性能就會得到顯著的提高。但是,這也給線程管理和同步帶來了一定的麻煩。
實現的四種方法:
(1)負載共享:進程不是分配到一個特定的處理器。系統維護一個就緒進程的全局隊列,每個處理器只要空閑就從隊列中選擇一個線程,確保當有工作可做時,沒有處理器空閑。註意,這裏與“負載均衡”不同,負載均衡是基於一種比較永久的分配方案分配工作的。
(2)組調度:一組相關的線程基於一對一的原則,同時調度到一組處理器上運行。
(3)專用處理器分配:與“負載共享”的方法相反,它通過把線程指定到處理器來定義隱式的調度。在程序執行過程中,每個程序被分配給一組處理器,處理器的數目與程序中線程的數目相等。當程序終止時,處理器返回到總的處理器池中,可供分配給另一個程序。
(4)動態調度:在執行期間,進程中線程的數目可以改變。

四、實時調度

1、關於實時計算和實時系統:
實時計算正在成為越來越重要的原則。調度器可能是實時系統中最重要的組件。
實時計算定義:系統的正確性不僅取決於計算的邏輯結果,而且還依賴於產生結果的時間。我們可以通過定義實時進程或實時任務來定義實時系統。
實時系統特點:可確定性、可響應性、用戶控制、可靠性、故障弱化操作。核心是短程任務調度器。
快速的進程或線程切換;
體積小;
迅速響應外部中斷的能力;
通過諸如信號量、信號、事件之類進程間通信的工具,實現多任務處理
使用特殊的順序文件,可以快速存儲數據
基於優先級的搶占式調度;
最小化禁止中斷的時間間隔;
用於使任務延遲一段固定的時間或暫停/恢復任務的原語;
特別的警報和超時設定。

實時系統的核心是短程任務調度器

實時進程的幾種調度器(如下圖所示):
輪轉搶占式調度器;
優先級驅動非搶占式調度器;
優先級驅動、在搶占點搶占的調度器;
立即搶占式調度器。

技術分享

2、實時調度
關鍵因素是滿足“最後期限”,在很大程度上依靠搶占和對相對最後期限有反應的算法。

最大期限的概念:當可以指定進程完成的最後期限時,調度原則將降低其他目標,使得滿足最後期限的作業數目的百分比最大。

實時調度算法大概有如下幾種:
靜態表法:執行關於可行性調度的靜態分析;
靜態優先級搶占法:同樣執行一個靜態分析,但是沒有制定調度,而且用於給任務指定優先級,使得可以使用傳統的基 於優先級的搶占式調度器;
基於動態規劃調度法:在運行時動態的確定可行性,而不是在開始運行前離線的確定;
動態盡力調度法:不執行可行性分析,系統試圖滿足所有的最後期限,並終止任何已經開始運行但錯過最後期限的進程

五、Linux調度

Linux2.4的實時調度器與非實時的進程調度器耦合在了一起。(Linux 2.6也是如此,但是對非實時調度器進行了改進)

(一)Linux的實時調度
負責Linux調度的三個類:
SCHED_FIFO:先進先出實時線程
SCHED_RR:輪轉實時線程
SCHED_OTHER:其他非實時線程
每個類都使用了多優先級,實時類的優先級高於SCHED_OTHER類。
默認的設置是:實時優先級類的優先級範圍0~99,SCHED_OTHER類的範圍是100~199 。(小優)

對於FIFO類,有以下規則:
1、除非在以下情況,系統不會中斷一個正在執行的FIFO線程:
a、另一個具有更高優先級的FIFO線程就緒;
b、正在執行的FIFO線程因為等待一個事件(如I/O)而被阻塞;
c、正在執行的FIFO線程通過調用sched_yield原語自願放棄處理器。
2、當一個FIFO線程被中斷後,它被放置在一個與其優先級相關聯的隊列中。
3、當一個FIFO線程就緒,並且如果該線程比當前正在執行的線程具有更高的優先級時,當前正在執行的線程被搶占,具有更高優先級且就緒的FIFO線程開始執行。如果有多個線程都具有最高的優先級,則選擇等待時間最長的線程。

對於SCHED_RR類,與FIFO類類似,只是在RR策略下,每個線程都有一個時間量與之關聯。當一個RR線程在它的時間量裏執行結束後,它被掛起,然後調度器選擇一個具有相同或更高優先級的實時線程運行。

下面舉例說明兩個類的區別:假設存在四個線程ABCD,共有三種優先級,其中,D>B=C>A,且B在隊列中的等待時間長於C,那麽
對於FIFO類,調度器的執行順序為: D--->B--->C--->A
對於RR類,調度器的執行順序為: D--->B--->C--->B--->C--->A
RR類將會按照“時間片”來執行,不會考慮線程的等待時間。

對於SCHED_OTHER類,只有當沒有實時線程運行就緒時,才可以執行這個類中的線程。

(二)Linux非實時調度
Linux 2.6改進了Linux 2.4中的非實時調度類SCHED_OTHER類,采用了一種全新的優先級調度策略,稱為O(1)調度策略
這個程序的設計原則是不管系統的負載或者處理器的數目如何變化,選擇合適的任務並執行的時刻都是恒定的。
Linux2.6為每個優先級級別維護了一個單獨的隊列。總的隊列個數是MAX_PRIO,默認值是140。內核為每個處理器維護了兩套調度用的數據結構,分別為活動的隊列結構、過期的隊列結構。
每一個非實時的任務都被分配了一個範圍從100~139的初始優先級,默認值是120 。
時間片分配的範圍是10~200ms,一般而言,具有較高優先級的任務分配的時間片也較大。
在優先級隊列中,處理實時任務的方式與處理非實時任務的方式不同,應用了下面一些考慮:
1、所有的實時任務具有靜態的優先級;不會作動態優先級的改變。
2、SCHED_FIFO任務沒有時間片。這些任務以FIFO的方式調度。如果一個SCHED_FIFO任務被阻塞,當它沒有被阻塞的時候,將返回到同樣優先級的活動隊列中。
3、SCHED_RR任務從不移到過期隊列中。當一個SCHED_RR任務用完了自己的時間片後,它將返回到具有同樣時間片的優先級隊列。時間片的值不會被改變。
這些規則的效果是活動隊列與過期隊列之間的轉換僅僅發生在沒有準備就緒的實時任務在等待執行的時候。

操作系統精髓與設計原理------調度概述