1. 程式人生 > >作業系統期末複習1

作業系統期末複習1

程序排程演算法

程序排程的任務

(1)儲存處理機的現場資訊
(2)按某種演算法選取程序
(3)把處理器分配給程序

程序排程機制

(1)排隊器
(2)分派器
(3)上下文切換器

程序排程方式

(1)非搶佔方式
某一程序被排程執行後,除非由於它自身的原因不能執行,否則一直執行下去
(2)搶佔方式
當有比正在執行的程序優先順序更高的程序就緒時,系統可強行剝奪正在執行程序的CPU,提供給具有更高優先順序的程序使用

批處理系統的排程演算法

先來先服務(FCFS-First Come First Serve)

按照程序就緒的先後順序使用CPU

最短作業優先(SJF-Shortest Job First)

具有最短完成時間的程序優先執行
非搶佔式

最短剩餘時間優先

(SRTN-Shortest Remaining Time Next)

最高響應比優先

(HRRN-Highest Response Ratio Next)
排程時,首先計算每個程序的響應比R;之後,總是選擇 R 最高的程序執行
響應比R = 週轉時間 / 處理時間
= (處理時間 + 等待時間)/ 處理時間

批處理系統的排程演算法

輪轉排程演算法

優先順序排程演算法

是把處理機分配給就緒佇列中優先順序最高的程序,分為以下兩種:
(1)非搶佔式優先順序排程演算法
(2)搶佔式優先順序排程演算法

多佇列排程演算法

多級反饋佇列排程演算法

設定多個就緒佇列,第一級佇列優先順序最高
給不同就緒佇列中的程序分配長度不同的時間片,第一級佇列時間片最小;隨著佇列優先級別的降低,時間片增大
當第一級佇列為空時,在第二級佇列排程,以此類推
各級佇列按照時間片輪轉方式 進行排程
當一個新建立程序就緒後,進入第一級佇列
程序用完時間片而放棄CPU,進入下一級就緒佇列
由於阻塞而放棄CPU的程序進入相應的等待佇列,一旦等待的事件發生,該程序回到原來一級就緒佇列(?)

基於公平原則的排程演算法

死鎖的預防和避免方法

一組程序中,每個程序都無限等待被該組程序中另一程序所佔有的資源,因而永遠無法得到的資源,這種現象稱為程序死鎖,這一組程序就稱為死鎖程序

產生死鎖的必要條件

互斥使用(資源獨佔)

一個資源每次只能給一個程序使用

佔有且等待(請求和保持,部分分配)

程序在申請新的資源的同時保持對原有資源的佔有

不可搶佔(不可剝奪)

資源申請者不能強行的從資源佔有者手中奪取資源,資源只能由佔有者自願釋放

迴圈等待

存在一個程序等待佇列 {P1 , P2 , … , Pn},
其中P1等待P2佔有的資源,P2等待P3佔有的資源,…,Pn等待P1佔有的資源,形成一個程序等待環路

解決死鎖的辦法

不考慮此問題(鴕鳥演算法)

不讓死鎖發生

死鎖預防
靜態策略:設計合適的資源分配演算法,不讓死鎖發生
死鎖避免
動態策略:以不讓死鎖發生為目標,跟蹤並評估資源分配過程,根據評估結果決策是否分配

讓死鎖發生

死鎖檢測與解除

死鎖預防

定義:在設計系統時,通過確定資源分配演算法,排除發生死鎖的可能性
具體的做法是:防止產生死鎖的四個必要條件中任何一個條件發生

破壞“互斥使用/資源獨佔”條件

資源轉換技術:把獨佔資源變為共享資源
SPOOLing技術的引入
解決不允許任何程序直接佔有印表機的問題
設計一個“守護程序/執行緒”負責管理印表機,程序需要列印時,將請求發給該daemon,由它完成列印任務

破壞“佔有且等待”條件

實現方案1:要求每個程序在執行前必須一次性申請它所要求的所有資源,且僅當該程序所要資源均可滿足時才給予一次性分配
問題:資源利用率低;“飢餓”現象
實現方案2:在允許程序動態申請資源前提下規定,一個程序在申請新的資源不能立即得到滿足而變為等待狀態之前,必須釋放已佔有的全部資源,若需要再重新申請

破壞“不可搶佔”條件

實現方案:
當一個程序申請的資源被其他程序佔用時,可以通過作業系統搶佔這一資源(兩個程序優先順序不同)
侷限性:適用於狀態易於儲存和恢復的資源
CPU、記憶體

破壞“迴圈等待”條件

通過定義資源型別的線性順序實現
實施方案:資源有序分配法
把系統中所有資源編號,程序在申請資源時必須嚴格按資源編號的遞增次序進行,否則作業系統不予分配
實現時要考慮什麼問題呢?
例子:解決哲學家就餐問題

死鎖避免

定義:
在系統執行過程中,對程序發出的每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,若分配後系統發生死鎖或可能發生死鎖,則不予分配,否則予以分配
安全狀態
如果系統中存在一個由所有程序構成的安全序列P1,…,Pn,則稱系統處於安全狀態

一個程序序列{P1,…,Pn}是安全的,如果對於每一個程序Pi(1≤i≤n):
它以後還需要的資源量不超過系統當前剩餘資源量與所有程序Pj (j < i )當前佔有資源量之和
則稱系統處於安全狀態

安全狀態一定沒有死鎖發生
不安全狀態:系統中不存在一個安全序列
不安全狀態一定導致死鎖

銀行家演算法:
仿照銀行發放貸款時採取的控制方式而設計的一種死鎖避免演算法
應用條件:
1. 在固定數量的程序中共享數量固定的資源
2. 每個程序預先指定完成工作所需的最大資源數量
3. 程序不能申請比系統中可用資源總數還多的資源
4. 程序等待資源的時間是有限的
5. 如果系統滿足了程序對資源的最大需求,那麼,程序應該在有限的時間內使用資源,然後歸還給系統

n:系統中程序數量
m:資源類數量
Available: ARRAY[1..m] of integer;
Max: ARRAY[1..n,1..m] of integer;
Allocation: ARRAY[1..n,1..m] of integer;
Need: ARRAY[1..n,1..m] of integer;
Request: ARRAY[1..n,1..m] of integer;
簡記符號:
Available
Max[i]
Allocation[i]
Need[i]
Request[i]

演算法:
當程序Pi提出資源申請時,系統執行下列步驟:
(1)若Request[i] ≤ Need[i],轉(2);
否則,報錯返回;
(2)若Request[i] ≤ Available,轉(3);
否則,程序等待;
(3)假設系統分配了資源,則有:
Available = Available - Request[i];
Allocation[i] = Allocation[i] + Request[i];
Need[i] = Need[i] - Request[i];
若系統新狀態是安全的,則分配完成
若系統新狀態是不安全的,則恢復原來狀態,程序等待

為進行安全性檢查,定義資料結構:
Work: ARRAY[1..m] of integer;
Finish: ARRAY[1..n] of Boolean;
安全性檢查的步驟:
(1) Work = Available;
Finish = false;
(2) 尋找滿足條件的i:
a. Finish[i]==false;
b. Need[i]≤Work;
如果不存在,則轉(4)
(3) Work = Work + Allocation[i];
Finish[i] = true;
轉(2)
(4) 若對所有i,Finish[i]==true,則系統處於安全狀態,否則系統處於不安全狀態

實時排程演算法

分類
①根據實時任務性質,可將實時排程的演算法分成硬實時排程演算法和軟實時排程演算法
②按排程方式,則可分為非搶佔排程演算法和搶佔排程演算法
1.非搶佔式排程演算法
(1)非搶佔式輪轉排程演算法
(2)非搶佔式優先排程演算法
2.搶佔式排程演算法
(1)基於時鐘中斷的搶佔式優先順序排程演算法
(2)立即搶佔的優先順序排程演算法

最早截止時間優先EDF演算法

任務的截止時間愈早,其優先順序愈高。

最低鬆弛度優先LLF演算法

磁碟訪問排程演算法

磁碟排程對的目標是使磁碟的平均尋倒時間最少

先來先服務(FCFS)

適用於I/O程序數較少的場合

最短尋道時間(SSTF)

該演算法選擇這樣的程序,其要求訪問的磁軌與當前磁頭所在的磁軌距離最近,以使每次的尋道時間最短,不能保證平均尋道時間最短。(實質上是基於優先順序的排程演算法,可能出現“飢餓”現象)

基於掃描的磁碟排程演算法

掃描(SCAN)演算法

不僅考慮到欲訪問的磁軌與當前磁軌間的距離,更優先考慮的是磁頭當前的移動方向。例如:當磁頭正在自裡向外移動時,SCAN演算法所考慮的是下一個訪問物件應是其欲訪問的磁軌既在當前磁軌之外,又是距離最近的。這樣自裡向外地訪問,直至再無更外的磁軌需要訪問時,才將磁臂換向為自裡向外移動。避免了“飢餓”現象。

迴圈掃描(CSCAN)演算法

CSCAN規定磁頭單向移動,例如,只是自裡向外移動,當磁頭移到最外的磁軌並訪問後,磁頭立即返回到最裡的欲訪問磁軌,亦即將最小磁軌號緊接著最大磁軌號構成迴圈,進行迴圈掃描。

NStepSCAN和FSCAN排程演算法

NStepSCAN演算法是將磁碟請求佇列分成若干個長度為N的子佇列,磁碟排程將按FCFS演算法依次處理這些子佇列。而每處理一個佇列時有時按SCAN演算法,對一個佇列處理完後,再處理其他佇列。當正在處理某子佇列時,如果又出現新的磁碟I/O請求,便將新請求程序放入其他佇列,這樣就可以避免出現粘著現象。當N=1時,NStepSCAN演算法便蛻化為FCFS演算法。
FCFS演算法只將磁碟請求佇列分成兩個子佇列。一個由當前所有請求磁碟I/O的程序形成的佇列,由磁碟排程按SCAN演算法進行處理。另一個是在掃描期間,將新出現的所有請求磁碟I/O的程序放入等待處理的請求佇列。