先進先出(FIFO)
先進先出的調度方式,看名字就知道,“大家”先來後到排好隊,一個一個調度。
這樣的調度方式實現起來很簡單,但僅僅這樣就夠了嗎?顯然不是,對於進程的調度,當然有性能的要求。
因此,要先引入一個評價性能的指標,來判斷FIFO的性能。
週轉時間和平均週轉時間
T週轉時間 = T完成時間 - T週轉時間
平均週轉時間,就是將進程的週轉時間加起來,再除以進程數。
T平均週轉時間 = (T進程1週轉時間 + T進程2週轉時間 + ... + T進程n週轉時間)/n
週轉時間是一個性能指標
評價FIFO的性能
先做一個假設,假設可以提前知道進程的運行時間
假設有3個進程:
進程編號 | 到達時刻 | 執行時間 | 完成時刻 | 週轉時間 |
---|---|---|---|---|
0 | 0 | 10 | 10 | 10 |
1 | 1 | 50 | 60 | 59 |
2 | 3 | 5 | 65 | 62 |
所以,平均週轉時間 = (10 + 59 + 62)/3
可以看到,使用FIFO調度的方式,並不是最優的。它只是簡單
思考一下:
如果0號進程運行完成,現在1號進程和2號進程都在等待調度,因爲2號進程的執行時間短,讓2號先執行,這樣就可以減少平均週轉時間。
進程編號 | 到達時刻 | 執行時間 | 完成時刻 | 週轉時間 |
---|---|---|---|---|
0 | 0 | 10 | 10 | 10 |
2 | 3 | 5 | 15 | 12 |
1 | 1 | 50 | 65 | 64 |
平均週轉時間 = (10 + 12 + 64)/3
顯然,平均週轉時間更少了。
短任務優先(SJF)
其實,上面提到個改進方式就是短任務優先。
如果有多個進程可以被調度,則優先調度執行時間短的那個
這樣就能保證平均週轉時間最小嗎?不能
進程編號 | 到達時刻 | 執行時間 | 完成時刻 | 週轉時間 |
---|---|---|---|---|
0 | 0 | 10 | 10 | 10 |
1 | 1 | 50 | 60 | 59 |
2 | 15 | 5 | 65 | 50 |
如果2好進程的執行時間很短,卻要等很長的時間,如果允許2號進程“插隊”,可以減少週轉時間
對於這種“插隊”(搶佔)的改進方式,就有了另一種調度方法:最短完成時間優先(STCF)
最短完成時間優先(STCF)
給SJF添加搶佔,就有了最短完成時間優先
進程編號 | 到達時刻 | 執行時間 |
---|---|---|
0 | 0 | 10 |
1 | 1 | 50 |
2 | 15 | 5 |
時刻 | 0 | 1 | 10 | 15 | 20 | 65 |
---|---|---|---|---|---|---|
0號進程 | 到達 | 執行中 | 執行完成 | - | - | - |
1號進程 | - | 到達 | 開始執行 | 被搶佔 | 開始執行 | 執行完成 |
2號進程 | - | - | - | 開始執行 | 執行完成 | - |
平均週轉時間 = (10 + 64 + 5)/3
這是最好的調度算法嗎?如果僅考慮週轉時間,它是最好的。但是,對於調度算法,並不能只通過週轉時間來衡量。還有另一個指標:響應時間