操作系統的進程調度

一、定義調度策略的準備

操作系統具有底層的機制與上層的調度策略,低層級制例如上下文切換已經在上一篇文章中有所瞭解,那麼上層的策略調度又是什麼呢?首先,我們如果要定義一種調度策略,自然首先要思考策略的運行環境以及調度指標。策劃你的運行環境就是策略在執行期間會出現的情況,例如:

1. 每一個進程開始執行的時間

2. 每一個進程持續執行的時間

3. 執行中的進程是否會出現空轉等待的情況

4. 在調用進程之前操作系統是否就能確認進程的相關信息

。。。。。。

等等,這些都是操作系統爲進程制定策略之前需要考慮的問題;

另外對於制定出來的調度策略,還要有明確的衡量指標,包括:

1.週轉時間(turnaround time)

週轉時間就是任務完成的時間減去任務開始的時間,對於操作系統來說也就是進程執行佔用CPU的時間。用公式表示就是:

          週轉時間   =  完成時間  - 開始時間

如果假設所有進程都從同一時刻開始執行,那麼週轉時間就等於完成時間;

對於同時需要執行的多個進程來講,還可以計算他們的平均週轉時間(average turnaround time),例如當前有A、B、C三個進程,如果ABC都是從0時刻開始執行,每個要執行10s,那麼平均週轉時間就等於: ((10-0)+(10-0)+(10-0))/3 = 10s;

2.響應時間(response time)

響應時間定義爲從進程到達操作系統到首次運行的時間,用公式表示就是:

          響應時間   =  首次運行時間  - 開始時間

例如:有三個進程ABC,其中A在時刻0到達,B和C分別在10與20到達,如果三個進程都需要執行20s,那麼也就是A會在20s時執行完畢,開始執行B,B在40s時執行結束開始執行C,C在60s時執行結束。對應的響應時間就是:A  0; B 40 - 20 = 20; C 60 - 10 = 50;

 

二、先進先出(FIFO)

有了環境假設與衡量指標之後就可以開始定義策略了,在上面計算響應時間的時候ABC的例子其實就是一種策略,ABC按照來的順序依次執行,只有等到前一個執行結束後一個纔可以開始執行,這就是最基本的調度算法:先進先出調度(First In First Out, FIFO),也被稱爲先到先服務。這種算法便於理解也便於實現。那麼試着衡量一下它:

情況1. 有3個進程ABC,假設幾乎都在時刻0到達操作系統,但是A最先C最後,

那麼可以得到他們的平均週轉時間爲:((10-0)+(20-0)+(30-0) )/3 = 20s,平均響應時間爲:((0-0)+(10-0)+(20-0))/3 = 10;

簡單來看還可以,那麼再來一個例子:

情況2:還是3個進程ABC, 仍然假設幾乎都在時刻0到達操作系統,A最先C最後,但是這次A要執行100s,

那麼計算平均週轉時間:((100-0)+(110-0)+(120-0))/3=110,平均響應時間:((0-0)+(100-0)+(110-0))/3 = 70;

這個結果與情況1相比就不是那麼令人樂觀了。這種問題學術上被稱爲“護航效應”(convoy effect),一些耗時較少的潛在資源消費者被排列在重量級的資源消費者之後 ,後續的消費者會浪費大量的時間。

 

三、最短任務優先(Shortest Job First, SJF)

根據護航效應,首先想到的最簡單的處理方法就是讓耗時少的消費者先進行,就像是在超市排隊購物,你前面的人有着兩輛推車的商品需要結算,而你只買了一瓶水,前面的人讓你先結賬這樣你就剩下了等待的時間。這種調度策略被稱爲最短任務優先,這個名字很好記,因爲這個策略內容就和名字一樣,先運行最短的任務。

那麼在試着衡量一下它:

情況1:條件不變;

但因爲策略的改變此時先執行最短的,但ABC時間相同所以其實情況1下沒有發生改變;

平均週轉時間仍爲20, 平均響應時間爲10;

情況二:由於策略的改變,那麼此時要先執行B,再執行C,最後執行A,那麼ABC執行結束的時間就分別爲:120,10,20

平均週轉時間爲((10-0)+(20-10)+(120-20)) /3 = 40,平均響應時間:((20-0)+(0-0)+(10-0))/3 = 10;

可以看到,相比FIFO提升巨大;這時可以想一下如果ABC到達時間不同呢?

情況3:A在時刻0到達,需要執行100s,BC在時刻10到達,都需要執行10s

此時由於0時刻只有A,那麼A就是最短的開始執行A,當B與C到達時CPU已經被A佔用,只能等到A執行結束B與C才能開始;

那麼平均週轉時間爲((100-0)+(110-10)+(120-10)) /3 = 103.33,平均響應時間:((100-0)+(110-10)+(120-0))/3 = 106.66;

那麼此時SJF也顯得不是很棒了;

 

四、最短完成時間優先(Shortest Time-to-Completion First)

之前在思考操作系統是如何與其他進程搶佔CPU的時候提到,硬件有時鐘中斷,那麼既然可以通過時鐘中斷切換進程,自然就可以將進程的執行順序修改。於是可以得到一種新的調度策略:最短完成時間優先,有時也被稱爲搶佔式作業優先調度程序。他的原理是每當新工作進入操作系統,先確定剩餘工作和新工作誰的剩餘時間最少,那麼就先執行誰。這時再考慮之前的例子,因爲情況一已經幾乎不再受到調度算法的影響,就先略過。

情況2:ABC同時到達,但BC執行時間段,所以先執行BC,之後執行A;

那麼平均週轉時間爲((120-0)+(10-00)+(20-0)) /3 = 50, 平均響應時間:((20-0)+(0-0)+(10-0))/3 = 10;

情況3:此時A從0開始執行,BC到達後,開始執行BC,A最後執行

那麼平均週轉時間爲((120-0)+(20-10)+(30-10)) /3 = 50,平均響應時間:((0-0)+(10-10)+(20-10))/3 = 3.33;

可以看到這種調度策略再存在執行時間差距很大的時候可以有效地降低平均時間,但是如果ABC是同時到達且耗時都很久呢?那麼後到的就還是需要等待前面的進程執行結束之後才能執行。這樣對於一些時間敏感的使用者來說是很難以接受的。那麼想要解決這個問題就可以考慮讓三個進程同時執行。

 

五、時片輪轉算法(time slice Round-Robin)

時間片輪轉算法的思想就是給每個進程同樣的權利也就是同樣的對CPU的使用時間,可以成爲調度量子(scheduling quantum),每個進程執行一個時間片後就切換,將CPU讓個下一個進程,所有的進程一直不停的切換,直到所有進程執行結束。因爲每個時間片都很短,那麼對於開發者來說就近乎是多個進程在同時執行。需要注意的是,時間片長度必須是時鐘中斷的整數倍,時間片長度不能過短也不能過長,過短會造成系統不停的切換進程不停的進行上下文切換,那麼就會在切換操作上耗費大量的時間,甚至可能佔到進程運行時間的百分之幾那麼長;時間片也不能過長,如果過長那麼在某些情況下就變回了SJF。

 

 

其實總的來說,任何相對公平的調度策略,例如時間片輪轉,在小規模時間內將CPU均勻分配給多個進程,具有良好的響應時間屬性對於週轉時間類的指標都表現不佳。但這是一種相對的割捨或者說是交換,如果開發者願意也可以捨棄響應時間來換取週轉時間的優化,那也就是類似於SJF之類的算法。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章