第三章 1/2 . 處理機排程與常見演算法+死鎖
處理機排程:多道程式環境下,動態的吧處理機分配給就緒佇列中的一個程序使之執行
提高處理機的利用率、改善系統性能,很大程度上取決於處理機排程的效能。
處理機排程便成為OS設計的中心問題之一。分配的任務由處理機排程程式完成
三級排程:高階排程、中級排程、低階排程
1、高階排程( 作業排程 或 長程排程 )
在每次執行作業排程時,都須作出兩個決定:
- 接納多少作業——取決於多道程式度。應根據系統的規模和執行速度等情況綜合考慮
- 接納哪些作業——取決於採用的排程演算法。如先來先服務,短作業優先等
系統執行並不一定存在高階排程
- 批處理系統:作業進入系統後先駐留外存,故需要有作業排程。
- 分時系統:為及時響應,作業由終端直接送入記憶體,故不需作業排程。
- 實時系統中,通常也不需作業排程
2、低階排程( 程序排程 或 微觀排程 )
程序排程方式:
- 非搶佔方式(Non-preemptive Mode)
- 一旦處理機分配給某程序,該程序一直執行。決不允許其他程序搶佔已分配執行程序的處理機。 - 搶佔方式(Preemptive Mode)
- 允許排程程式根據某種原則,暫停某個正在執行的程序,將處理機重新分配給另一程序
程序排程方法 | 排程的時機 | 特點 |
---|---|---|
非搶佔方式 | 程式完成;發生某事件阻塞; | 實現簡單、系統開銷小; 功能也簡單,適用於大多數批處理OS,但在要求較嚴格的實時系統,不宜採用該方式 |
搶佔方式 | 程式完成;發生某事件阻塞;新程序就緒; | 搶佔的原則有很多種:優先權高的可以搶佔優先順序低的程序的處理機。短作業(程序)可以搶佔長作業(程序)的處理機。各程序按時間片執行,一個時間片用完時重新進行排程 |
中級排程( 交換排程 )
引入目的:提高記憶體利用率和系統吞吐量,根據條件將一些程序調出或調入記憶體
三中排程的頻率和複雜度
- 程序排程:執行頻率最高,演算法不能太複雜,以免佔用太多的CPU時間。分時系統通常10~100ms便進行一次。
- 作業排程:一個作業執行完畢退出系統時即觸發重新排程一個新作業入記憶體,週期較長,大約幾分鐘一次。因而也允許作業排程演算法花費較多的時間。
- 中級排程:執行頻率基本上介於上述兩種排程之間。
三級排程比較:
排程型別 | 執行頻率 | 執行時間 | 演算法複雜度 |
---|---|---|---|
程序排程 | 高 | 短 | 低 |
中程排程 | 中等 | 較短 | 中等 |
作業排程 | 低 | 長 | 高 |
為此,應使那些暫時不能執行的程序不再佔用寶貴的記憶體資源,而將它們調至外存上去等待,把此時的程序狀態稱為就緒駐外存狀態或掛起狀態。當這些程序重又具備執行條件、且記憶體又稍有空閒時,由中級排程來決定把外存上的那些又具備執行條件的就緒程序,重新調入記憶體,並修改其狀態為就緒狀態,掛在就緒佇列上等待程序排程
排程佇列模型
- 僅有程序排程的排程佇列模型
- 具有高階和低階排程的排程佇列模型
- 同時具有三級排程的排程佇列模型
- 引入中級排程後,程序的狀態變化:
- 就緒狀態:分為記憶體就緒和外存就緒。
- 阻塞狀態:分為記憶體阻塞和外存阻塞。
中級排程使程序在上述狀態間變化,並使資料在內外存間互換
- 引入中級排程後,程序的狀態變化:
排程演算法準則
1)面向使用者準則
- 週轉時間短
- 響應時間快
- 均衡性
- 截止時間的保證
- 優先權準則
2)面向系統準則 - 系統吞吐量高(批處理系統的重要指標)
- 單位時間內所完成的作業數,跟作業本身(與作業平均長度密切相關)和排程演算法都有關係 - 處理機利用率好(主要針對大中型主機)
- 各類資源的平衡利用(主要針對大中型主機)
批處理系統 | 平均週轉時間短、系統吞吐量高、處理機利用率好 |
時分系統 | 響應時間快、均衡 |
實時系統 | 截止時間的保證、可預測性 |
排程演算法:
1、先來先服務排程演算法 FCFS
一種最簡單的排程演算法,按先後順序進行排程。既可用於作業排程,也可用於程序排程。
- 按照作業提交,或程序變為就緒狀態的先後次序分派CPU;
- 新作業只有噹噹前作業或程序執行完或阻塞才獲得CPU執行
- 被喚醒的作業或程序不立即恢復執行,通常等到當前作業或程序出讓CPU。 (所以,預設即是非搶佔方式)
不利於短作業
** 關於應用: 有利於CPU繁忙型的作業,而不利於I/O繁忙的作業(程序)
2、短作業(程序)優先排程演算法 SJF/SPF
-
優點:通過上表可見採用SJF/SPF演算法,平均週轉時間、平均帶權週轉時間都有明顯改善。SJF/SPF排程演算法能有效的降低作業的平均等待時間,提高系統吞吐量
-
方式:分搶佔和非搶佔兩種方式,上例為簡單的非搶佔式。
-
SJF/SPF的不足:
- 1. 對短作業有利,但同時造成了對長作業的不利。
- 2.由於作業(程序)的長短含主觀因素,不一定能真正做到短作業優先。
- 3.未考慮作業的緊迫程度,因而不能保證緊迫性作業(程序)的及時處理
3、高優先權優先排程演算法 HPF
分兩種方式:
- 非搶佔式優先權演算法
- 搶佔式優先權演算法 關鍵點:新作業產生時
** 靜態優先權:**建立程序時確定,整個執行期間保持不變。一般利用某一範圍的一個整數來表示,又稱為優先數。
** 動態優先權:**建立程序時賦予的優先權可隨程序的推進或隨其等待時間的增加而改變。
4、基於時間片的輪轉排程演算法 RR
(1)時間片輪轉演算法
- 將系統中所有的就緒程序按照FCFS原則,排成一個佇列。
- 每次排程時將CPU分派給隊首程序,讓其執行一個時間片。時間片的長度從幾個ms到幾百ms。
- 在一個時間片結束時,發生時鐘中斷。
- 排程程式據此暫停當前程序的執行,將其送到就緒佇列的末尾,並通過上下文切換執行當前就緒的隊首程序。
(2)多級反饋佇列演算法 FB
- 設定多個就緒佇列,各佇列有不同的優先順序,優先順序從第一個佇列依次降低。
- 賦予各佇列程序執行時間片大小不同, 優先權越高,時間片越短。
各演算法比較
演算法名稱 | 特點 | 方式 |
---|---|---|
FCFS | 最簡單、不利於短作業 | 非搶佔 |
SJF/SPF | 照顧平均週轉時間、不利於長作業 | 非搶佔 / 搶佔 |
HPF/HRRN | 優先權考慮全面 | 非搶佔 / 搶佔 |
RR | 及時響應、簡單 | 時間片搶佔 |
FB | 最綜合的一種演算法 | 時間片搶佔 / 立即搶佔 |
比較專案 \ 演算法 | FCFS(先來先服務) | RR(輪轉法) | SJF(短作業優先) | SRTF(最短剩餘時間優先) | HRRF(高響應比優先) | MFQ(多級反饋佇列) |
---|---|---|---|---|---|---|
選擇依據 | max[w] | 常量 | min[s] | min[s-e] | max((w+s)/s) | 見4.5.7節 |
排程方式 | 非搶佔式 | 搶佔式(按時間片) | 非搶佔式 | 搶佔式(程序到達時) | 非搶佔式 | 搶佔式(時間片) |
吞吐量 | 不突出 | 如果時間片太小可變低 | 高 | 高 | 高 | 不突出 |
響應時間 | 可能很高 | 對於短程序提供良好的響應時間 | 對於短程序提供良好的響應時間 | 提供良好的響應時間 | 提供良好的響應時間 | 不突出 |
開銷 | 最小 | 低 | 可能高 | 可能高 | 可能高 | 可能高 |
對程序的作用 | 不利於短程序和I/O繁忙程序 | 公平對待 | 不利於長程序 | 不利於長程序 | 較好的均衡 | 偏愛I/O繁忙性程序 |
“飢餓”問題 | 無 | 無 | 可能 | 可能 | 無 | 可能 |
處理及排程與死鎖
什麼是實時系統?
- 指系統能夠在限定的響應時間內提供所需水平的服務。
- 指計算的正確性不僅取決於程式的邏輯正確性,也取決於結果產生的時間,如果系統的時間約束條件得不到滿足,將會發生系統出錯。
實時任務:具有明確時間約束的計算任務,有軟/硬,隨機/週期性之分。
最低鬆弛度優先 LLF
鬆弛度= 截止完成時間 – 還需執行時間 - 當前時間
程序切換髮生的時機
- 程序執行完
- 程序I/O阻塞
- 新程序出現時可能的搶佔
- 某程序鬆弛度為0時發生搶佔
多道程式系統藉助併發執行改善資源利用率,提高系統吞吐量,但可能發生一種危險——死鎖
死鎖:指多個程序在執行過程中,因爭奪資源而造成的一種僵局。當程序處於這種狀態時,若無外力作用,它們都將無法再向前推進
- 死鎖(Deadlock): 指程序之間無休止地互相等待!
- 飢餓(Starvation):指一個程序無休止地等待!
產生死鎖的原因:
- 競爭資源:系統中供多個程序共享的資源如印表機、公用佇列等的數目不滿足需要時,會引起資源競爭而產生死鎖。
- 可剝奪和非剝奪興資源
- 可剝奪性資源:分配給程序後可以被高優先順序的程序剝奪。如CPU和主存。
- 不可剝奪性資源:分配給程序後只能在程序用完後釋放。如磁帶機、印表機等。 - 永久性和臨時性資源
- 永久性:印表機。可順序重複使用
- 臨時性:程序產生被其他程序短暫使用的資源,如資料資源:“生產者/消費者”演算法中的訊號量。。它可能引起死鎖。
- 可剝奪和非剝奪興資源
- 程序間推進順序非法:程序在執行過程中,請求和釋放資源的順序不當,同樣會導致死鎖。
- 推進順序合法
- 推進順序非法
-
產生死鎖的四個條件( 缺一不可 ):① 互斥條件 ② 請求和保持條件 ③ 不剝奪條件 ④ 環路等待條件
處理死鎖:事先預防 ① 預防死鎖 ② 避免死鎖 事後處理 ③ 檢測死鎖 ④ 解除死鎖
只要使系統始終處於安全狀態,便可避免發生死鎖。不是所有的不安全狀態都是死鎖狀態。