操作系统原理第五章:CPU调度
目錄
- 1 CPU調(diào)度基本概念
- 1.1 基本概念
- 1.2 CPU調(diào)度的時(shí)機(jī)
- 1.3 CPU調(diào)度方案
- 2 CPU調(diào)度算法
- 2.1 先來先服務(wù)(FCFS)
- 2.2 短作業(yè)優(yōu)先(SJF)
- 2.3 優(yōu)先級
- 2.4 RR時(shí)間片輪轉(zhuǎn)
- 2.5 多級隊(duì)列和多級反饋隊(duì)列
1 CPU調(diào)度基本概念
1.1 基本概念
CPU調(diào)度就是就從就緒隊(duì)列中選擇一個(gè)進(jìn)程來分配CPU的過程,進(jìn)行CPU調(diào)度的原因是為了實(shí)現(xiàn)多道,使得CPU有更高的利用率,之所以進(jìn)程能夠進(jìn)行CPU調(diào)度是因?yàn)檫M(jìn)程的特點(diǎn),進(jìn)程執(zhí)行過程中分為兩個(gè)脈沖一個(gè)是CPU脈沖 (CPU Burst),一個(gè)是 I/O 脈沖 (I/O Burst),即在 CPU 上執(zhí)行和等待 I/O ,進(jìn)程的執(zhí)行以 CPU 脈沖開始,其后跟著 I/O 脈沖,進(jìn)程的執(zhí)行就是在這兩個(gè)狀態(tài)之間進(jìn)行轉(zhuǎn)換,如下圖所示:
觀察CPU脈沖的統(tǒng)計(jì)后發(fā)現(xiàn),CPU 脈沖的分布,在系統(tǒng)中存在許多短 CPU 脈沖,只有少量的長 CPU 脈沖,比如 I/O 型作業(yè)具有許多短 CPU 脈沖,而 CPU 型作業(yè)則會有幾個(gè)長 CPU 脈沖,這個(gè)分布規(guī)律對CPU 調(diào)度算法的選擇是非常重要的,下圖是對CPU脈沖的統(tǒng)計(jì)直方圖,橫軸是時(shí)間,豎軸是頻率,可以發(fā)現(xiàn)頻率在0~8ms的高頻脈沖是比較多的:
1.2 CPU調(diào)度的時(shí)機(jī)
當(dāng)CPU空閑時(shí),OS就選擇內(nèi)存中的某個(gè)就緒進(jìn)程,并給其分配CPU,以下是進(jìn)程狀態(tài)轉(zhuǎn)換圖,當(dāng)某個(gè)進(jìn)程從running狀態(tài)離開時(shí),就代表當(dāng)前CPU就空閑了,圖中紅色和藍(lán)色的箭頭都代表著會發(fā)生CPU調(diào)度:
CPU的調(diào)度可能發(fā)生在以下情況:
- 從運(yùn)行轉(zhuǎn)到等待 (Switches from running to waiting state):非搶占式調(diào)度;
- 從運(yùn)行轉(zhuǎn)到就緒 (Switches from running to ready state):搶占式調(diào)度,時(shí)間片到;
- 從等待轉(zhuǎn)到就緒 (Switches from waiting to ready):搶占式調(diào)度,若某個(gè)在就緒隊(duì)列的進(jìn)程優(yōu)先級較高,則會搶占CPU,所以是搶占式調(diào)度;
- 終止運(yùn)行 (Terminates):非搶占式調(diào)度。
1.3 CPU調(diào)度方案
CPU調(diào)度方案分為以下兩種:
- 非搶占方式 (nonpreemptive):把處理機(jī)分配給某進(jìn)程后,便讓其一直執(zhí)行,直到該進(jìn)程完成或發(fā)生某事件而被阻塞時(shí),才把處理機(jī)分配給其它進(jìn)程,不允許其他進(jìn)程搶占已經(jīng)分配出去的處理機(jī),其優(yōu)點(diǎn)是實(shí)現(xiàn)簡單、系統(tǒng)開銷小,適用于大多數(shù)批處理系統(tǒng)環(huán)境,缺點(diǎn)是難以滿足緊急任務(wù)的要求,不適用于實(shí)時(shí)、分時(shí)系統(tǒng)要求
- 搶占方式(Preemptive mode):允許調(diào)度程序根據(jù)某個(gè)原則,去停止某個(gè)正在執(zhí)行的進(jìn)程,將處理機(jī)重新分配給另一個(gè)進(jìn)程
對于搶占方式,搶占有如下的原則:
- 時(shí)間片原則:各進(jìn)程按時(shí)間片運(yùn)行,當(dāng)一個(gè)時(shí)間片用完后,便停止該進(jìn)程的執(zhí)行而重新進(jìn)行調(diào)度。這個(gè)原則適用于分時(shí)系統(tǒng);
- 優(yōu)先權(quán)原則:通常對一些重要的和緊急的進(jìn)程賦予較高的優(yōu)先權(quán)。當(dāng)這種進(jìn)程進(jìn)入就緒隊(duì)列時(shí),如果其優(yōu)先權(quán)比正在執(zhí)行的進(jìn)程優(yōu)先權(quán)高,便停止正在執(zhí)行的進(jìn)程,將處理機(jī)分配給優(yōu)先權(quán)高的進(jìn)程,使之執(zhí)行;
- 短作業(yè)優(yōu)先原則:當(dāng)新到達(dá)的作業(yè)比正在執(zhí)行的作業(yè)明顯短時(shí),將暫停當(dāng)前長作業(yè)的執(zhí)行,將處理機(jī)分配給新到的短作業(yè),使之執(zhí)行。
2 CPU調(diào)度算法
設(shè)計(jì)CPU調(diào)度算法的性能指標(biāo)有如下幾點(diǎn):
- CPU利用率:使CPU盡可能的忙碌;
- 吞吐量:單位時(shí)間內(nèi)運(yùn)行完的進(jìn)程數(shù);
- 周轉(zhuǎn)時(shí)間:進(jìn)程從提交到運(yùn)行結(jié)束的全部時(shí)間 ;
- 等待時(shí)間:進(jìn)程在就緒隊(duì)列中等待調(diào)度的時(shí)間片總和;
- 響應(yīng)時(shí)間 :從進(jìn)程提出請求到首次被響應(yīng)的時(shí)間段,在分時(shí)系統(tǒng)環(huán)境下不是輸出完結(jié)果的時(shí)間
注:調(diào)度算法影響的是等待時(shí)間 , 而不能影響進(jìn)程真正使用CPU 的時(shí)間和 I/O 時(shí)間
2.1 先來先服務(wù)(FCFS)
先來先服務(wù) (First-Come-First-Served),其算法思想和字面意思一樣,就是先到來的進(jìn)程,先被調(diào)度,這是最簡單的調(diào)度算法,FCFS屬于非搶占方式,一旦一個(gè)進(jìn)程占有處理機(jī),它就一直運(yùn)行下去,直到該進(jìn)程完成或者因等待某事件而不能繼續(xù)運(yùn)行時(shí)才釋放處理機(jī)。FCFS 算法易于實(shí)現(xiàn),表面上很公平 ,實(shí)際上有利于長作業(yè),不利于短作業(yè);有利于 CPU 繁忙型,不利于 I/O 繁忙型,可以看下面的例子。
假設(shè)有 P1P_1P1?,P2P_2P2?,P3P_3P3? 三個(gè)進(jìn)程,所需的CPU脈沖時(shí)間分別為24,3,3,如下表:
| P1P_1P1? | 24 |
| P2P_2P2? | 3 |
| P3P_3P3? | 3 |
現(xiàn)設(shè)三個(gè)進(jìn)程到來的順序是 P1P_1P1?,P2P_2P2?,P3P_3P3?,那么該調(diào)度的Gantt圖如下:
各個(gè)進(jìn)程的等待時(shí)間如下表:
| P1P_1P1? | 0 |
| P2P_2P2? | 24 |
| P3P_3P3? | 27 |
平均等待時(shí)間為 t=0+24+273=17t=\frac{0 + 24 + 27}{3}=17t=30+24+27?=17。
現(xiàn)假設(shè)三個(gè)進(jìn)程到來的順序是 P2P_2P2?,P3P_3P3?,P1P_1P1?,那么該調(diào)度的Gantt圖如下:
各進(jìn)程的等待時(shí)間如下表:
| P1P_1P1? | 6 |
| P2P_2P2? | 0 |
| P3P_3P3? | 3 |
平均等待時(shí)間為 t=6+0+33=3t=\frac{6 + 0 + 3}{3}=3t=36+0+3?=3。
由上面兩個(gè)例子可以看出,在先來先服務(wù)算法中,進(jìn)程到來的次序?qū)ζ骄却龝r(shí)間的影響是很大的,這里有個(gè)專業(yè)名詞叫做 護(hù)航效應(yīng) (Convoy effect)
護(hù)航效應(yīng) (Convoy effect):
- 假設(shè)有一個(gè)CPU進(jìn)程和許多I/O型進(jìn)程
- 當(dāng)CPU進(jìn)程占用CPU運(yùn)行時(shí), I/O型進(jìn)程可能完成了其I/O操作,回到就緒隊(duì)列等待CPU, I/O設(shè)備空閑
- CPU進(jìn)程釋放CPU后, I/O型進(jìn)程陸續(xù)使用CPU,并很快轉(zhuǎn)為I/O操作,CPU空閑
在這種情況下,CPU和 I/O 設(shè)備并沒有得到有效的利用。
2.2 短作業(yè)優(yōu)先(SJF)
短作業(yè)優(yōu)先 (Shortest-Job-First),其算法思想是關(guān)聯(lián)到每個(gè)進(jìn)程下次運(yùn)行的 CPU 脈沖長度,調(diào)度最短的進(jìn)程,由于進(jìn)程是不斷調(diào)入到就緒隊(duì)列中的,其整個(gè)就緒隊(duì)列中的最短作業(yè),也是動(dòng)態(tài)變化的,此時(shí)就要面臨一個(gè)問題了,若現(xiàn)在到來了一個(gè)所需CPU脈沖時(shí)間最短的一個(gè)進(jìn)程,那么是讓當(dāng)前執(zhí)行的進(jìn)程讓位,還是等當(dāng)前進(jìn)程執(zhí)行完再執(zhí)行,所以有如下兩種策略:
- 非搶占式調(diào)度:一旦進(jìn)程擁有 CPU , 它的使用權(quán)限只能在該 CPU 脈沖結(jié)束后讓出;
- 搶占式調(diào)度 :發(fā)生在有比當(dāng)前進(jìn)程剩余時(shí)間片更短的進(jìn)程到達(dá)時(shí),也稱為最短剩余時(shí)間優(yōu)先調(diào)度
短作業(yè)優(yōu)先SJF算法是最優(yōu)的,因?yàn)閷σ唤M指定的進(jìn)程而言,它給出了最短的平均等待時(shí)間,如下面的例子:
現(xiàn)有四個(gè)進(jìn)程 P1P_1P1?,P2P_2P2?,P3P_3P3?,P4P_4P4?,他們的到達(dá)時(shí)間和所需CPU脈沖時(shí)間如下表:
| P1P_1P1? | 0 | 7 |
| P2P_2P2? | 2 | 4 |
| P3P_3P3? | 4 | 1 |
| P4P_4P4? | 5 | 4 |
若采用搶占式的調(diào)度,其調(diào)度Gantt圖如下:
平均等待時(shí)間為 t=9+1+0+24=3t=\frac{9 + 1 + 0 + 2}{4}=3t=49+1+0+2?=3。
若采用非搶占式的調(diào)度,其調(diào)度Gantt圖如下:
平均等待時(shí)間為 t=0+6+3+74=4t=\frac{0 + 6 + 3 + 7}{4}=4t=40+6+3+7?=4。
雖說短作業(yè)優(yōu)先算法是最優(yōu)的算法,但是實(shí)際上在實(shí)現(xiàn)起來確實(shí)很難的,因?yàn)橐粩嗟慕y(tǒng)計(jì)各個(gè)進(jìn)程所需的CPU脈沖時(shí)間,這顯然實(shí)現(xiàn)難度高,就算能實(shí)現(xiàn),其開銷也會非常大,所以實(shí)際應(yīng)用中是估計(jì)進(jìn)程所需時(shí)間,可以通過先前的CPU脈沖長度及計(jì)算指數(shù)均值進(jìn)行估計(jì)。
綜上所述,采用SJF有利于系統(tǒng)減少平均周轉(zhuǎn)時(shí)間,提高系統(tǒng)吞吐量,一般情況下SJF調(diào)度算法比FCFS調(diào)度算法的效率要高一些, 但實(shí)現(xiàn)相對要困難些。如果作業(yè)的到來順序及運(yùn)行時(shí)間不合適,會出現(xiàn)饑餓現(xiàn)象,例如,系統(tǒng)中有一個(gè)運(yùn)行時(shí)間很長的作業(yè)JN,和幾個(gè)運(yùn)行時(shí)間小的作業(yè),然后,不斷地有運(yùn)行時(shí)間小于JN的作業(yè)的到來,這樣,作業(yè)JN就因得不到調(diào)度而餓死。另外,作業(yè)運(yùn)行的估計(jì)時(shí)間也有問題。
2.3 優(yōu)先級
上面所講的短作業(yè)優(yōu)先算法實(shí)際上是優(yōu)先級算法的一個(gè)特例,短作業(yè)優(yōu)先算法將作業(yè)所需時(shí)間定為衡量優(yōu)先級的量,表示優(yōu)先級的量一般為一個(gè)整數(shù),這里假定越小的數(shù)優(yōu)先級越高,下面 P1P_1P1?,P2P_2P2?,P3P_3P3?,P4P_4P4?,P5P_5P5? 五個(gè)進(jìn)程的調(diào)度狀況如下:
| P1P_1P1? | 10 | 3 |
| P2P_2P2? | 1 | 1 |
| P3P_3P3? | 2 | 4 |
| P4P_4P4? | 1 | 5 |
| P5P_5P5? | 5 | 2 |
根據(jù)優(yōu)先級,其調(diào)度順序?yàn)?P2P_2P2?,P5P_5P5?,P1P_1P1?,P3P_3P3?,P4P_4P4?,平均等待時(shí)間為 8.2 。
那么進(jìn)程的優(yōu)先級如何確定呢?通常在進(jìn)程創(chuàng)建時(shí)確定,且在整個(gè)生命期中保持不變,這種叫靜態(tài)優(yōu)先級,靜態(tài)優(yōu)先級就會出現(xiàn)饑餓問題,即某個(gè)進(jìn)程若優(yōu)先級非常低,它幾乎永遠(yuǎn)得不到CPU調(diào)度。
一個(gè)很有意思的例子:當(dāng)MIT的IBM7094機(jī)器于1973年關(guān)掉時(shí),人們發(fā)現(xiàn)一個(gè)于1967年提交的一個(gè)低優(yōu)先權(quán)的進(jìn)程還沒有得到運(yùn)行。
解決方法是老化,根據(jù)進(jìn)程等待時(shí)間的延長提高其優(yōu)先數(shù),也就是動(dòng)態(tài)優(yōu)先級,優(yōu)先級會根據(jù)等待時(shí)間不斷調(diào)整。考慮改變優(yōu)先級的因素通常有進(jìn)程的等待時(shí)間,已使用CPU的時(shí)間,資源使用情況等。
2.4 RR時(shí)間片輪轉(zhuǎn)
RR (Round Robin),這個(gè)算法主要用在分時(shí)系統(tǒng)里,這個(gè)算法的思想是每個(gè)進(jìn)程將得到小單位的 CPU 時(shí)間 (時(shí)間片),通常為 10-100 毫秒 。時(shí)間片用完后,該進(jìn)程將被搶占并插入就緒隊(duì)列末尾。
例如有四個(gè)進(jìn)程 P1P_1P1?,P2P_2P2?,P3P_3P3?,P4P_4P4? 如下表,設(shè)時(shí)間片大小為 20:
| P1P_1P1? | 53 |
| P2P_2P2? | 17 |
| P3P_3P3? | 68 |
| P4P_4P4? | 24 |
其調(diào)度Gantt圖如下:
一般來說,RR的平均周轉(zhuǎn)時(shí)間比SJF長,但響應(yīng)時(shí)間要短一些。
對于時(shí)間片輪轉(zhuǎn)算法,確定時(shí)間片大小是非常重要的,若時(shí)間片過大,則每個(gè)進(jìn)程都能在單個(gè)時(shí)間片能完成,則時(shí)間片輪轉(zhuǎn)等價(jià)于先來先服務(wù)算法,若時(shí)間片過小,則各個(gè)進(jìn)程要頻繁的切換,造成大量的資源開銷。
2.5 多級隊(duì)列和多級反饋隊(duì)列
多級隊(duì)列的意思是把進(jìn)程根據(jù)其某種屬性進(jìn)行分類,每一類的進(jìn)程都會組成一個(gè)就緒隊(duì)列,也就是說在操作系統(tǒng)中會有多個(gè)就緒隊(duì)列,每個(gè)進(jìn)程固定的處在自己所屬的隊(duì)列中,對于不同的隊(duì)列,也可以有自己專屬的調(diào)度算法,那么此時(shí)就要進(jìn)行隊(duì)列的調(diào)度,可以給每個(gè)隊(duì)列設(shè)置不同的優(yōu)先級,若是固定優(yōu)先級,則會產(chǎn)生饑餓問題。那么另一種解決方案就是基于時(shí)間片的算法,給定 時(shí)間片調(diào)度,即個(gè)隊(duì)列得到一定的 CPU 時(shí)間,進(jìn)程在給定時(shí)間內(nèi)執(zhí)行,如下圖:
若某個(gè)進(jìn)程在一個(gè)優(yōu)先級較低的隊(duì)列中,那么它就會一直處于饑餓狀態(tài),解決方案是多級反饋隊(duì)列調(diào)度,存在多個(gè)就緒隊(duì)列,具有不同的優(yōu)先級,各自按時(shí)間片輪轉(zhuǎn)法調(diào)度,它與多級隊(duì)列的不同是它允許進(jìn)程在隊(duì)列之間移動(dòng),當(dāng)一個(gè)進(jìn)程執(zhí)行完一個(gè)完整的時(shí)間片后被搶占處理器,被搶占的進(jìn)程優(yōu)先級降低一級而進(jìn)入下級就緒隊(duì)列,如此繼續(xù),直至降到進(jìn)程的基本優(yōu)先級。而一個(gè)進(jìn)程從阻塞態(tài)變?yōu)榫途w態(tài)時(shí)要提高優(yōu)先級,最后會將I/O型和交互式進(jìn)程留在較高優(yōu)先級隊(duì)列,如下圖:
總結(jié)
以上是生活随笔為你收集整理的操作系统原理第五章:CPU调度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统原理第四章:线程
- 下一篇: 操作系统原理第六章:进程同步