操作系统第三章笔记
第三章
處理機調度概述
處理機調度的層次
- 高級調度:又稱長程調度或作業調度,它的調度對象是作業,決定將外存中處于后備隊列中的哪些作業調入內存中,為他們創建進程,分配資源,發生頻率最低,每個作業只調入一次,調出一次。調入創建PCB,調出撤銷PCB
- 低級調度:又稱短程調度或進程調度。是指根據算法。進程從就緒到運行的狀態,調入CPU中運行。
- 中級調度:又稱內存調度,主要目的是提高內存利用率和吞吐量,決定將哪些進程調入內存,哪些進程調出內存。如從運行到掛起,掛起到就緒。
作業和作業調度(高級調度)
- 作業:包含程序,數據,作業說明書等。
- 作業控制塊(JCB):作業存在標志,類同PCB,保存了很多作業的信息。每當一個作業進入系統,“作業注冊”程序會建立一個JCB
- 作業調度的主要任務:即高級調度的主要任務,根據JCB中的信息,檢查系統中的資源能否滿足作業的需求,然后調入內存,創建進程到就緒隊列等。
進程調度(低級調度)
- 進程調度任務(低級調度任務):保護CPU現場安全;按某種算法選取進程;把CPU分配給進程
- 進程調度機制:為了實現進程調度,在進程調度機制中,有3個基本部分
- 排隊器:用來排隊成就緒隊列的
- 分派器:把CPU分配給進程
- 上下文切換器:進程切換時,把被切換的進程的上下文內容從CPU寄存器保存至對應的PCB,新進來的進程反之。
- 進程調度方式
- 非搶占調度方式:正常情況一直運行,除非已經執行完畢或者發生了什么事讓它執行不了,正在執行的進程I/O請求去阻塞態了,或者通信或者同步時執行了原語操作,比如阻塞原語(Block),優點:實現簡單,開銷小,適用大多數批處理系統。
- 搶占調度方式:把處理機搶了,不是任意搶的,要遵守原則,原則主要有:優先級原則;短進程優先原則;時間片原則等
處理機調度算法的目標
- 處理機調度算法的共同目標
- 資源利用率高
CPU利用率=(CPU有效工作時間)/(CPU有效工作時間+CPU空閑等待時間) - 公平性:各進程得到合理CPU時間,防止饑餓。
- 平衡性:平衡系統資源,盡量使系統中CPU和各種I/O設備經常處于忙碌狀態
- 策略強制執行:對于制定的策略,只要有需要,就必須準確執行
- 資源利用率高
- 批處理系統中處理機調度算法的目標
- 平均周轉時間短:周轉時間為作業開始到完成的時間。各個進程完成時間-到達時間之和/總進程數,周轉時間包含:作業在外存后備隊列中等待調度時間+進程在就緒隊列上的等待調度時間+CPU執行事件+等待IO操作時間
- 平均帶權周轉時間短:各個周轉時間/運行時間之和/總進程數
- 系統吞吐量高:單位時間內系統完成的作業數
- CPU利用率高:提高方法:盡量選擇計算量大的作業
分時系統中處理機調度算法的目標
- 響應時間快:從用戶通過鍵盤提交請求開始到系統首次響應
- 均衡性:系統響應時間快慢與用戶請求服務的復雜性成正比
實時系統的目標
- 截止時間的保證
- 可預測性準則
調度算法
先來先服務算法(FCFS)
它是非搶占式的,優點是比較公平,算法實現簡單,不會產生饑餓,算法主要思想:按到達的時間順序為進程分配CPU,如果是用于作業調度,則是按到達的時間順序將作業調入內存,分配資源創建進程,插入就緒隊列。
特點:有利于長作業,不利于短作業,有利于CPU密集/繁忙型的作業,不利于I/O繁忙的,因為他們跑的慢,來的晚。無法實現人機交互。
短作業優先調度算法(SJF)
一般是非搶占式的,暫不介紹搶占式的,它追求最少的平均帶權周轉時間,平均周轉時間,平均等待時間(周轉時間-運行時間),有效的提高系統吞吐量,按作業長短來調度,越短越先運行。可用于作業和進程調度。
缺點:對長作業不公平,會產生饑餓;如果是進行作業調度,必須預先的知道作業的運行時間;沒有考慮作業的緊迫程度,不能保證緊迫性作業能得到及時處理
優先級調度算法
調度思想:在后備隊列中選擇一個或多個優先級最高的作業,將他們調入內存…放入就緒隊列。或者根據進程優先級選擇。簡單易行,系統開銷小。會發生饑餓,如果有源源不斷的優先級高的進程到來。有搶占式和非搶占式優先級調度算法。
優先級的類型:靜態優先級,和隨著時間延長而增加的動態優先級
優先級確認方法:進行類型-系統進程高于一般用戶進程的優先權。進程對資源的要求-對CPU和內存要求小,運行時間短的優先權高些。用戶要求-根據用戶進程的緊迫程度和用戶所付費用決定
高響應比優先調度算法
- 通常用于作業調度;高響應比優先調度算法只是優先級調度算法的一個特例。不會產生饑餓
優先級=(等待時間+要求服務時間)/要求服務時間=響應時間/要求服務時間。響應比(Rp)即優先級肯定是大于等于1的。 - 每次調度之前都會計算響應比,會增加系統的開銷
輪轉調度算法(RR)
- 基于時間片的輪轉調度算法。把CPU劃分為若干個時間片,按順序賦給FCFS就緒隊列中的每個進程。時間片用完后就會產生時鐘中斷請求,即使進程為執行完畢,系統也剝奪該進程的CPU。
- RR的進程切換時機:
時間片內進程已運行完成,立即激活進程調度程序。時間片用完,計時器中斷處理程序被激活,送當前進程到就緒隊列末尾。 - 時間片大小的確定:
- 時間片小,利于短進程,但進程調度切換頻繁,增加開銷。
- 時間片大,退化為FCFS,無法滿足短作業和交互式進程的需求。
- 時間片可選取略大于一次典型交互的所需時間,使大多數交互式進程能在一個時間片內完成,從而獲得很小的響應時間。
多級反饋隊列調度算法
該算法為搶占式算法。調度機制如下:
- 設置多個就緒隊列。在系統中設置多個就緒隊列,并為每個隊列賦予不同的優先級,第一個隊列的優先級最高,第二個隊列次之,其余隊列的優先級依次降低。在優先級越高的隊列中,其時間片越小。
- 每個隊列都采用FCFS,當進程最后被降到第n隊列后,在第n隊列中便采取RR方式運行
- 按隊列優先級調度:調度程序首先調度最高優先級隊列中各進程運行,僅當第一隊列空閑時,才調度第二隊列中進程運行。
- 調度算法性能:
- 終端型作業用戶:交互型作業,第一級隊列的時間片可完成
- 短批處理作業用戶:最多輪兩次就可完成,周轉時間較短
- 長批處理作業用戶:不必擔心長期得不到調度,比簡單輪轉性能好。
實時調度
在實時系統中,有兩類不同性質的實時任務,即HRT和SRT任務,他們都聯系著一個截止時間。實時調度必須滿足實時任務對截止時間的要求
實現實時調度的基本條件
- 提供必要的信息
- 就緒時間
- 開始截止時間和完成截止時間
- 處理時間
- 資源要求
- 優先級
- 系統處理能力強
假設系統中有m個周期性的硬實時任務,處理時間為Ci,周期時間為Pi(1<=i<=m)
單處理機下滿足:m個Ci/Pi之和小于等于1
多處理機即小于等于N(處理機個數) - 采用搶占式調度機制
- 采用快速切換機制(廣泛采用)
- 對外部中斷的快速響應能力:要求對緊迫的外部中斷及時響應,要求快速硬件中斷機構,允許中斷的間隔短
- 快速的任務分派能力:為了提高分派程序任務切換速度,使運行功能單位適當小,減少切換任務時的時間開銷
實時調度算法分類
- 根據實時任務性質不同可分為硬實時調度和軟實時調度
- 根據調度方式不同可分為非搶占調度和搶占調度算法
- 非搶占式調度算法
- 非搶占式輪轉調度算法:不太嚴格的實時控制系統
- 非搶占式優先調度算法:較為嚴格
- 搶占式調度算法
- 基于時鐘中斷的搶占式優先權調度算法:優先級高的進程到的時候,也要等當前進程時鐘中斷后,才能搶
- 立即搶占的優先權調度算法:一旦出現請求中斷的緊急任務,只要當前任務未處于臨界區,就馬上搶
- 非搶占式調度算法
- 根據調度時間的不同分成靜態和動態調度算法
- 在多處理機情況下可分為集中式和分布式調度算法
最早截止時間優先算法(EDF)
根據任務的截止時間確定任務的優先級,任務的截止時間越早,其優先級越高,具有最早截止時間的任務排在隊列的前面。
- 非搶占式調度方式用于非周期實時任務
最低松弛度優先算法(LLF)
該算法在確定任務的優先級時,根據的是任務的緊急程度(或松弛度)。任務緊急程度越高,賦予該任務的優先級就越高,以使其可被優先執行
松弛度=必須完成時間-還需運行的時間-當前時間
松弛度是可以動態變化的,主要用于可搶占式調度方式。有點類似于最高響應比算法,只是計算公式不一樣,松弛度越小,優先級越高,松弛度不能小于0
死鎖概述
一組進程中的每個進程都在等待被該組的其他進程占有的資源,處于一種僵持局面,沒有外力作用,都無法向前推進,這種現象稱為進程死鎖,這組進程稱為死鎖進程。即這組進程都在吃著碗里的,看著鍋里的。
- 可搶占資源和不可搶占資源
- 可搶占資源:進程獲得資源后,這類資源可以被其他進程或系統搶占
- 不可搶占資源:一旦分配出去后就不能強行收回,只能進程自己釋放。
計算機系統中的死鎖
- 競爭不可搶占資源引起死鎖:不可搶占代表你有皮球我有槍,你我即想要皮球又想要槍,但是我們家長在,不能打架搶,所以死鎖了,都玩不愉快
- 競爭可消耗資源引起死鎖:比如在哲學家就餐問題中的筷子
- 進程推進順序不當引起死鎖
死鎖的定義、必要條件與處理方法
- 死鎖的定義:一組進程中的每個進程都在等待僅有該組進程中的其他進程才能引發的事件發生,那么該組進程是死鎖的
- 產生死鎖的條件
- 互斥條件:涉及的資源是非共享的
- 不可搶占條件:不能搶占其他進程擁有資源
- 請求和保持條件:進程在等待一新資源時繼續占有已分配的資源
- 循環等待條件:存在一種進程的循環鏈,鏈中的每一個進程已獲得的資源同時被鏈中的下一個進程所請求
- 死鎖的處理方法
- 預防死鎖:通過某種限制條件,去破壞死鎖四個必要條件中的一個或多個,來防止死鎖
- 優點:較易實現,廣泛使用
- 缺點:由于所施加的限制往往太嚴格,可能導致系統資源利用率和系統吞吐量的降低
- 避免死鎖:不破壞四條件,僅在資源分配的過程中,用某種方法去防止系統進入不安全狀態,從而避免死鎖的發生
- 優點:事先只需要較弱的限制條件,可獲得較高的資源利用率和系統吞吐量
- 檢測死鎖:事先不采取任何措施,允許死鎖發生
- 優點:檢測死鎖的發生,并精確確定與死鎖有關的進程和資源,然后采取適當措施將系統中已發生的死鎖清除掉
- 解除死鎖:將進程解脫出來,常用的方法是撤銷或掛起進程,回收資源,再將資源分配給阻塞狀態的進程
- 特點:實現難度大,但可獲得較好的資源利用率和系統吞吐量
- 預防死鎖:通過某種限制條件,去破壞死鎖四個必要條件中的一個或多個,來防止死鎖
資源分配圖
二元組G=<N,E>
- N:節點集:分為P,R兩部分
- P={p1,p2,…,pn}進程結點
- R={r1,r2,…,rm}資源結點
- E:邊的集合,其元素為有序二元組<pi,rj><rj,pi>
資源類:用方框表示
資源實例:用方框中的黑圓點(圈)表示
進程:用圓圈中加進程名表示
分配邊:資源實例->進程
申請邊:進程->資源類
死鎖預防
破壞“請求和保持”條件
- 第一種協議:執行時不再提出資源請求
所有進程開始運行前,一次性申請運行時需要的全部資源,如果有足夠資源滿足才能運行。運行中不請求,若有資源不足以分配給該進程,則該進程所有的資源即使空閑也不會分配,不保持有資源
缺點:用戶作業必須等待,直到所有資源滿足才能運行,一個作業運行時間很短,甚至不會用到。 - 第二種協議:請求,不保持所有資源
獲得初期的資源就運行,運行過程中先慢慢釋放自己的用完的全部資源,再進行請求資源
破壞“不可搶占”條件
一個已擁有資源的進程,若它在提出新資源要求而不能立即得到滿足時,它必須釋放已經擁有的所有資源待以后需要時再重新申請
缺點:實現復雜且要付出很大代價(以前的工作失效,執行推遲)
破壞“循環等待”條件
系統將所有資源按類型進行線性排序,并賦予不同的序號,所有進程對資源的請求必須嚴格按照資源序號遞增的次序提出,總有一個進程會占用較高序號的資源,此后它繼續申請的資源必然是空閑的,因此進程可以一直推進
優點:同前兩法相比,其資源利用率和系統吞吐量有較明顯的改善
缺點:進程實際需要資源的順序不一定與資源的編號一致,因此仍會造成資源浪費;資源的序號必須相對穩定,從而限制了新設備的增加
死鎖避免
系統安全狀態
在系統運行過程中,對進程提出的每一個(系統能滿足的)資源申請進行動態檢查(安全性檢查)根據檢查結果決定是否分配資源,若分配后系統可能發生死鎖,則不予分配,否則予以分配
- 安全狀態:如果系統能按照某種順序為每個進程分配它所需的資源,直到所有進程都能運行完成,稱為安全狀態。
- 處于不安全狀態的系統不一定會死鎖,安全狀態一定不會死鎖
- 由安全狀態進入不安全狀態:如果不按安全序列分配資源,則系統可能會由安全狀態進入不安全狀態
利用銀行家算法避免死鎖
- 銀行家算法中的數據結構
- 可利用資源向量Available:是一個含有m個元素的數組
- 最大需求矩陣Max:n*m矩陣,n為進程數,m為資源種類數,Max[i,j]代表第i個進程對j類資源的最大需求
- 分配矩陣Allocation:n*m矩陣,表示進程已分配的每類資源數
- 需求矩陣Need:表示進程還需要各類資源數
Need[i,j]=Max[i,j]-Allocation[i,j]
- 可利用資源向量Available:是一個含有m個元素的數組
- 銀行家算法
- 當Pi發出資源請求,分配一個Request向量
Requesti:是進程Pi的請求向量
如果Requesti[j]=K,表示進程i需要K個Rj類型的資源 - 當進程Pi提出資源申請時Requesti[j],系統執行下列步驟:
- 當Pi發出資源請求,分配一個Request向量
- 安全性算法
增加兩個向量:Work和Finish- Work表示系統可提供給進程繼續運行所需的各類資源數目(即在試著分配過程中,系統的可用資源數)
初始值 Work=Available(可用資源向量) - Finish表示系統是否有足夠的資源分配給進程i,使之運行完成
初始值 Finish[i]=false,當有足夠資源分配給進程時,Finish[i]=true
- Work表示系統可提供給進程繼續運行所需的各類資源數目(即在試著分配過程中,系統的可用資源數)
銀行家算法舉例
-
假設系統中有五個進程{P0,P1,P2,P3,P4}和三類資源{A,B,C},各種資源的數量分別為10,5,7在T0時刻的資源分配情況如下:
To時刻可以找到一個安全系列<P1,P3,P4,P2,P0>,安全序列可以不唯一 -
P1發出請求Request(1,0,2),系統能分配資源嗎
執行銀行家算法
Request1(1,0,2),Need1,Available- Request1(1,0,2)<=Need1(1,2,2);
- Request1(1,0,2)<=Available(3,3,2);
- 系統為P1進行預分配,并修改Available,Allocation1和Need1向量
- Available=Available-Request1=(3,3,2)-(1,0,2)=(2,3,0)
- Allocation1=Allocation1+Request1=(2,0,0)+(1,0,2)=(3,0,2)
- Need1=Need1-Request1=(1,2,2)-(1,0,2)=(0,2,0)
- 執行安全性算法
- Work:=Available=(2,3,0);Finish[i]:=false;
- 在進程集合中找到Need1=(0,2,0)<=Work;
- 則設P1可順利執行完成,從而有:Work:=Work+Allocation1=(2,3,0)+(3,0,2)=(5,3,2);Finish[1]:=true
- 在進程集合中找到Need3=(0,1,1)<=Work(5,3,2)且FInish[3]=false;
…
…
- 執行安全性算法檢查時,仍能夠得到安全序列{P1,P3,P0,P2,P4},故請求向量Request1(1,0,2)發出時系統安全!可以將P1請求資源分配給它
- 還可以找到一個安全序列{P1,P3,P4,P0,P2}
根據以上規則P4發出Request(3,3,0),不滿足第二步,P0發出請求Request(0,2,0),找不到一個安全序列,系統都不能分配資源
死鎖的檢測與解除
如果資源分配圖中沒有環路,則系統中沒有死鎖,如果圖中存在環路則系統中可能存在死鎖
如果每個資源類中只包含一個資源實例,則環路是死鎖存在的充要條件
死鎖的檢測
- 找到一個非阻塞非獨立的節點,去掉分配和請求邊,變成孤立節點
- 再將相應資源分配給一個等待該資源的進程,即將某進程的申請邊變為分配邊
- 重復以上步驟,如果所有進程都可孤立,則改圖是可完全簡化的,否則稱改圖是不可完全簡化的
- 死鎖狀態的充分條件:資源分配圖是不可完全簡化的
死鎖的解除
搶占資源;終止或者撤銷進程(終止所有進程,逐個終止進程)
重要的是以最小的代價解除死鎖,恢復系統運行,方法如下:
- 撤銷所有的死鎖進程
- 連續撤銷死鎖進程直至不再存在死鎖
- 連續剝奪資源直到不再存在死鎖
- 把每個死鎖進程備份到前面的定義的某個檢測點,并重新啟動所有進程
總結
- 上一篇: 面试中应注意的事项
- 下一篇: 在ipad上的几款远程桌面工具使用体会