三、处理机调度与死锁
??上一章介紹的進(jìn)程主要從概念出發(fā),但程序執(zhí)行終歸是動態(tài)的。進(jìn)程如何參與程序的動態(tài)執(zhí)行過程呢?在多道程序下,進(jìn)程的數(shù)量遠(yuǎn)大于處理機(jī)的數(shù)量。那如何對進(jìn)程進(jìn)行安排(處于就緒狀態(tài)的進(jìn)程有好多,選哪些進(jìn)程給處理機(jī)執(zhí)行),才能達(dá)到一些我們期望的指標(biāo)(系統(tǒng)吞吐率,資源利用率,響應(yīng)的及時性)?而這一切的實(shí)現(xiàn)很大程度取決于處理機(jī)調(diào)度性能的好壞。
??從內(nèi)容上說,本章大體可以分為三個部分:CPU調(diào)度、實(shí)時調(diào)度、死鎖。下面讓我們一一介紹下吧!
??一、 CPU調(diào)度
??一個程序從最開始在內(nèi)存中到最后執(zhí)行完畢經(jīng)歷了一段過程。從調(diào)度角度上來看,經(jīng)過了三個調(diào)度階段。分別是高級調(diào)度、中級調(diào)度、低級調(diào)度
??高級調(diào)度/長程調(diào)度/作業(yè)調(diào)度
??高級調(diào)度指從外存中選出若干作業(yè),為它們分配進(jìn)程,并改變進(jìn)程的狀態(tài)為就緒狀態(tài)
??低級調(diào)度/進(jìn)程調(diào)度/短程調(diào)度
??低級調(diào)度指在就緒隊(duì)列中選擇一個進(jìn)程為它提供處理機(jī)資源
??中級調(diào)度/內(nèi)存調(diào)度
??中級調(diào)度的目的是提高內(nèi)存利用率和系統(tǒng)吞吐率。方式是將內(nèi)存中暫時不能運(yùn)行的進(jìn)程放到外存中(俗稱掛起)。當(dāng)具備運(yùn)行條件后再由中級調(diào)度重新調(diào)入內(nèi)存。
??大致順序就是高級調(diào)度->低級調(diào)度->(中級調(diào)度)->執(zhí)行結(jié)束。由于分時特點(diǎn),低級調(diào)度可能要多次。
??衡量處理機(jī)調(diào)度算法的好壞有幾個指標(biāo),也是目標(biāo)。優(yōu)化這些目標(biāo)就是我們的目的。
??周轉(zhuǎn)時間
??周轉(zhuǎn)時間指從作業(yè)被提交給系統(tǒng)開始,到作業(yè)完成為止的這段時間間隔。包括下圖四個部分:
??平均周轉(zhuǎn)時間
??平均周轉(zhuǎn)時間就是所有作業(yè)的周轉(zhuǎn)時間之和除以作業(yè)個數(shù)
??帶權(quán)周轉(zhuǎn)時間
??帶權(quán)周轉(zhuǎn)時間指周轉(zhuǎn)時間除以執(zhí)行時間。執(zhí)行時間就是結(jié)束時間減去開始時間
??概念比較抽象,下面結(jié)合一個例題看看:
??以作業(yè)二為例,計(jì)算它的周轉(zhuǎn)時間,帶權(quán)周轉(zhuǎn)時間
??周轉(zhuǎn)時間是完成時間-提交時間 是13.00-10.10=2.9
??帶權(quán)周轉(zhuǎn)時間是周轉(zhuǎn)時間/執(zhí)行時間,執(zhí)行時間是完成時間-開始時間=13.00-12.00 = 1。帶權(quán)周轉(zhuǎn)時間 = 2.9/1 = 2.9。
??同理計(jì)算作業(yè)1,3的周轉(zhuǎn)時間求和再除以三,就得到平均周轉(zhuǎn)時間了。簡不簡單!
??說別的都沒用,好壞還是要看調(diào)度算法怎么樣。下面就介紹一下6種調(diào)度算法:
??先來先服務(wù)調(diào)度算法(FCFS, first come first serve)
??這種是最容易實(shí)現(xiàn)的算法,先到先執(zhí)行。那我們來評價(jià)一下這個算法的性能:
??上圖有四個作業(yè),A,B,C,D依次到達(dá)。直接看性能(帶權(quán)周轉(zhuǎn)性能),A,B,D都可以看,但C有點(diǎn)兒慘。但實(shí)際上C執(zhí)行的時間相當(dāng)短,這就是因?yàn)镃在B這個很長的任務(wù)后面。導(dǎo)致周轉(zhuǎn)時間特別長,遠(yuǎn)超執(zhí)行時間。這種算法對短任務(wù)很不友好,短任務(wù)在長任務(wù)前面執(zhí)行還好,但在后面性能就會特別差。
??短作業(yè)優(yōu)先調(diào)度算法
??(1) 最短作業(yè)優(yōu)先
??這種算法就有優(yōu)先級存在了,作業(yè)越短優(yōu)先級越高。這就保證了短任務(wù)都能先執(zhí)行。舉個例子,說明執(zhí)行過程:
??假設(shè)它們都是同一時間到達(dá),burst time是執(zhí)行時間。按照最小原則,執(zhí)行順序依次是4,??1,3,2。從直觀上感覺,這個性能應(yīng)該比FCFS好點(diǎn)兒。但這個算法有一個很難搞的問題:我怎么知道一個進(jìn)程會執(zhí)行多長時間呢?所以要用這個,就必須去估算一下,而且誤差還不能太大。
??(2) 最短剩余時間優(yōu)先
??這個和最短作業(yè)優(yōu)先很像,是它的搶占式版本。搶占的依據(jù)就是正在執(zhí)行的進(jìn)程A剩余時間比新來的進(jìn)程B整個時間還要長。這種思想也很好理解,假如B一直沒有來,A作為唯一進(jìn)程執(zhí)行,執(zhí)行一旦開始就會直至結(jié)束。如果A很長,B很短的話,B來了也不能執(zhí)行,有點(diǎn)兒退化成了FCFS。最短剩余時間每時每刻都檢查進(jìn)程的剩余時間來決定分配。用例子說明下:
??0時刻,P1到達(dá)執(zhí)行P1。1時刻P2到達(dá),P2是4,P1是7,優(yōu)先P2。2時刻到達(dá),P1是7,P2是3,P3是9,繼續(xù)P2,3時刻仍是P2最小。P2執(zhí)行完選最小的是P4的5,P4結(jié)束后再進(jìn)行P1的7,再P3的9。畫出圖來,就是這樣:
??這個算法也有缺陷,也要執(zhí)行程序的執(zhí)行時間。不過性能和最短作業(yè)相比要好。
??優(yōu)先級調(diào)度算法
??(1) 普通優(yōu)先級調(diào)度
?? 其實(shí)前幾種方法已經(jīng)體現(xiàn)了優(yōu)先級思想,就是時間越少,優(yōu)先級越高。但這算法中顯式的給出優(yōu)先級,于是進(jìn)程就按照優(yōu)先級執(zhí)行就行了。
??(2) 高響應(yīng)比優(yōu)先級調(diào)度
?? 不過前一種方法存在一個問題,優(yōu)先級是怎么確定呢?確定會不會不公平呢?所以高響應(yīng)比算法用相應(yīng)比去評價(jià)優(yōu)先級:
??當(dāng)使用響應(yīng)比以后,就比較公平啦!這樣的優(yōu)點(diǎn)是兼顧了長短進(jìn)程,但計(jì)算優(yōu)先權(quán)也要一點(diǎn)兒額外開銷。
?? 輪轉(zhuǎn)調(diào)度算法
?? 輪轉(zhuǎn)調(diào)度有點(diǎn)兒像分時復(fù)用,把處理機(jī)分很多個時間片。均勻的分給所有進(jìn)程,這就保證了所有進(jìn)程都能夠得到執(zhí)行。這種方法問題就是時間片的大小不好確定,時間太長變成了先到先服務(wù),時間太短來回上下文切換頻次太高,不值當(dāng)!
?? 多級隊(duì)列調(diào)度
??多級隊(duì)列的思想是針對于不同進(jìn)程的不同需求,對于交互進(jìn)程希望響應(yīng)時間短(且不管是否執(zhí)行完,但要開始執(zhí)行),比較適合輪轉(zhuǎn)調(diào)度。但后臺的批處理(數(shù)值計(jì)算),一直算就行,只要保證能夠執(zhí)行就可以,就可以用FCFS。所以這里的多級隊(duì)列就是將就緒隊(duì)列分成多個隊(duì)列,不同隊(duì)列根據(jù)需求使用不同算法。
?? 多級反饋隊(duì)列調(diào)度
?? 多級反饋隊(duì)列就是在多級隊(duì)列基礎(chǔ)上改進(jìn)了一下,增強(qiáng)了動態(tài)性。使用多級隊(duì)列(不同隊(duì)列可以不同算法),如果進(jìn)程在第一級沒有得到處理,就到第二級。。。以此類推,直到執(zhí)行為止。
??二、實(shí)時調(diào)度
?? 對于實(shí)時調(diào)度其實(shí)不是課程的重點(diǎn),但在嵌入式操作系統(tǒng)中都是實(shí)時調(diào)度。還是有必要簡單了解下滴。那啥叫實(shí)時調(diào)度呢?來一個引入:
??在這個系統(tǒng)中,周期是50ms,而每次處理時間10ms,如果對于5個任務(wù)來說可以執(zhí)行(相鄰執(zhí)行時間滿足最大間隔要求),但如果是6個任務(wù)的話,任務(wù)A第一次執(zhí)行和第二次執(zhí)行間隔60ms,超過了50ms的周期,沒法完成調(diào)度了。所以系統(tǒng)是否能夠進(jìn)行實(shí)時調(diào)度,是有條件的,就是:
??概念是概念,具體的調(diào)度過程是由算法決定的,下面就介紹一下常用的實(shí)時調(diào)度算法:
??最早截至?xí)r間優(yōu)先(EDF, earliest deadline first)
?? 這個算法思想很簡單,就是按照截至?xí)r間來決定優(yōu)先級。越早截至,優(yōu)先級越高。舉個例子:
??這個例子中,任務(wù)到達(dá)都是在進(jìn)程執(zhí)行中。在非搶占式情況下是沒影響的。截至?xí)r間依次是1342,所以任務(wù)執(zhí)行順序也就是1342。
??最低松弛度優(yōu)先(LLF, least laxity first)
?? 這個需要先解釋啥什么叫松弛度,可以理解成該任務(wù)為保證完成最晚從哪里開始到當(dāng)前的長度。選短的(最緊迫)執(zhí)行。這個理解比較抽象,舉個例子:
??進(jìn)程A1執(zhí)行截至?xí)r間是20,進(jìn)程B1截至?xí)r間是50,A1執(zhí)行時間是10,B1執(zhí)行時間是25。那A1松弛度為10,B1松弛度為25。A1優(yōu)先執(zhí)行。A1到10的時候執(zhí)行結(jié)束,其他任務(wù)還沒到,B1開始執(zhí)行。到20時,A2到達(dá),A2截至?xí)r間為40,執(zhí)行時間為10,松弛度為10(30必須開始)。B1松弛度為15(已經(jīng)執(zhí)行了10,還有15,50-15-20=15)優(yōu)先執(zhí)行A2,依次類推,最終執(zhí)行結(jié)果圖如下:
??三、死鎖
?? 前面陸續(xù)地介紹過了死鎖,死鎖一種現(xiàn)象。會讓程序運(yùn)行終止,系統(tǒng)資源利用率降低。這節(jié)中更為詳細(xì)的介紹一下死鎖,并給出一些死鎖的解決辦法。
?? 了解了死鎖的含義,但也不知道怎么描述,下面給一個具體定義:如果一組進(jìn)程中每個進(jìn)程都在等待只有組內(nèi)其他進(jìn)程才能引發(fā)的事件,就稱這一組進(jìn)程處于死鎖狀態(tài)。有個問題來了,如何避免死鎖呢?其實(shí)死鎖發(fā)生需要一些條件,如果我們能避免這些條件,那不就可以解除死鎖了嗎!我們稱這些條件為必要條件:
??對死鎖的解決還有三個策略:
??比較有意思的是,課程主要講了前兩種策略,但實(shí)際應(yīng)用過程中第三種更為廣泛。但對于第三種也沒有深刻探究,還是就介紹下學(xué)過的吧!
?? 預(yù)防策略
?? 之前說要破壞條件,那上面介紹了四個條件。互斥條件是不可避免的(因?yàn)榛コ馐菫榱吮WC進(jìn)程之間有效運(yùn)行的必要條件,所有進(jìn)程的執(zhí)行都需要滿足互斥,不能為了這個不管那個)
?? 另外三種都有一些方法(直接截圖介紹了):
?? 避免策略
?? 為什么要提出避免策略呢?是因?yàn)轭A(yù)防策略過于保守(怎么理解?預(yù)防策略解決問題的方式是直接不讓問題發(fā)生,這顯然是一種方法,但過程過于絕對,可能帶來一些其他的影響。更優(yōu)的策略顯然是可以讓問題發(fā)生,并進(jìn)而想方法解決問題。這就是避免策略!)避免 策略有一些新規(guī)定:
??簡單來說,避免策略的思想就是,如果一個操作會讓安全狀態(tài)變成不安全狀態(tài),那么就不執(zhí)行這個操作。那如何判定呢?不能每次都靠看啊。下面就介紹一個專門用來判斷的算法:銀行家算法。
?? 銀行家算法的思想是找到一個正確的就是正確的,找不到正確的就是錯誤的。算法的描述如下:
??有四個變量:
??Available:當(dāng)前系統(tǒng)中可以進(jìn)行分配的資源數(shù)
??Max:各進(jìn)程所需要的最大資源數(shù)
?? Allocation:各進(jìn)程已經(jīng)分配的資源數(shù)
?? Need:各進(jìn)程還需要的資源數(shù) Need = Max – Allocaiton
?? 計(jì)算完四個變量后,就需要對操作進(jìn)行判斷。有幾個步驟:
??1. 首先將進(jìn)程請求設(shè)為變量request,如果requset小于need,跳轉(zhuǎn)2。否則認(rèn)為出錯,因??為要求值超過宣布的最大值。
??2. 然后判斷request是否小于available,滿足到3,否則說明進(jìn)程目前沒有足夠資源
??3. 試探將資源進(jìn)程分配,然后啟用安全策略進(jìn)行判斷。
??完成上面這些已經(jīng)差不多一半兒了!下面看看安全性算法吧:
??結(jié)合一個具體的例子看下:
??按照上面的算法,其中變量的變換過程如下圖:
??第三章打板兒,繼續(xù)學(xué)習(xí),繼續(xù)加油吧!
因作者水平有限,如有錯誤之處,請?jiān)谙路皆u論區(qū)指出,謝謝!
總結(jié)
以上是生活随笔為你收集整理的三、处理机调度与死锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言:16进制字符串转int
- 下一篇: IDA实战视频