調度的基本准則包括CPU利用率、系統吞吐量、周轉時間、等待時間、響應時間等。
- 系統吞吐量表示單位時間內CPU完成作業的數量
- 周轉時間為作業完成時刻減去作業到達的時刻
- 等待時間是指進程處於等處理器狀態的時間之和,等待時間越長,用戶滿意度越低
- 響應時間是指從用戶提交請求到系統首次響應所用的時間
典型調度算法如下:
1、先來先服務調度算法
先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於作業調度,也可用於進程調度。當在作業調度中采用該算法時,每次調度都是從后備作業隊列中選擇一個或多個最先進入該隊列的作業,將它們調入內存,為它們分配資源、創建進程,然后放入就緒隊列。在進程調度中采用FCFS算法時,則每次調度是從就緒隊列中選擇一個最先進入該隊列的進程,為之分配處理機,使之投入運行。該進程一直運行到完成或發生某事件而阻塞后才放棄處理機。
2、短作業(進程)優先調度算法
短作業(進程)優先調度算法,是指對短作業或短進程優先調度的算法。它們可以分別用於作業調度和進程調度。短作業優先(SJF)的調度算法是從后備隊列中選擇一個或若干個估計運行時間最短的作業,將它們調入內存運行。而短進程優先(SPF)調度算法則是從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它,使它立即執行並一直執行到完成,或發生某事件而被阻塞放棄處理機時再重新調度。
3、時間片輪轉法
在早期的時間片輪轉法中,系統將所有的就緒進程按先來先服務的原則排成一個隊列,每次調度時,把CPU分配給隊首進程,並令其執行一個時間片。時間片的大小從幾ms到幾百ms。當執行的時間片用完時,由一個計時器發出時鍾中斷請求,調度程序便據此信號來停止該進程的執行,並將它送往就緒隊列的末尾;然后,再把處理機分配給就緒隊列中新的隊首進程,同時也讓它執行一個時間片。這樣就可以保證就緒隊列中的所有進程在一給定的時間內均能獲得一時間片的處理機執行時間。換言之,系統能在給定的時間內響應所有用戶的請求。
4、多級反饋隊列調度算法
前面介紹的各種用作進程調度的算法都有一定的局限性。如短進程優先的調度算法,僅照顧了短進程而忽略了長進程,而且如果並未指明進程的長度,則短進程優先和基於進程長度的搶占式調度算法都將無法使用。而多級反饋隊列調度算法則不必事先知道各種進程所需的執行時間,而且還可以滿足各種類型進程的需要,因而它是目前被公認的一種較好的進程調度算法。在采用多級反饋隊列調度算法的系統中,調度算法的實施過程如下所述:
1)應設置多個就緒隊列,並為各個隊列賦予不同的優先級。第一個隊列的優先級最高,第二個隊列次之,其余各隊列的優先權逐個降低。該算法賦予各個隊列中進程執行時間片的大小也各不相同,在優先權愈高的隊列中,為每個進程所規定的執行時間片就愈小。例如,第二個隊列的時間片要比第一個隊列的時間片長一倍,第i+1個隊列的時間片要比第i個隊列的時間片長一倍。
2)當一個新進程進入內存后,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,便可准備撤離系統;如果它在一個時間片結束時尚未完成,調度程序便將該進程轉入第二隊列的末尾,再同樣地按FCFS原則等待調度執行;如果它在第二隊列中運行一個時間片后仍未完成,再依次將它放入第三隊列,……,如此下去,當一個長作業(進程)從第一隊列依次降到第n隊列后,在第n隊列便采取按時間片輪轉的方式運行。
3)僅當第一隊列空閑時,調度程序才調度第二隊列中的進程運行;僅當第1~(i-1)隊列均空時,才會調度第i隊列中的進程運行。如果處理機正在第i隊列中為某進程服務時,又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶占正在運行進程的處理機,即第i隊列中某個正在運行的進程的時間片用完后,由調度程序選擇優先權較高的隊列中的那一個進程,把處理機分配給它。
5、優先權調度算法
為了照顧緊迫型作業,使之在進入系統后便獲得優先處理,引入了最高優先權優先(FPF)調度算法。此算法常被用於批處理系統中,作為作業調度算法,也作為多種操作系統中的進程調度算法,還可用於實時系統中。當把該算法用於作業調度時,系統將從后備隊列中選擇若干個優先權最高的作業裝入內存。當用於進程調度時,該算法是把處理機分配給就緒隊列中優先權最高的進程,這時,又可進一步把該算法分成如下兩種。
1) 非搶占式優先權算法
在這種方式下,系統一旦把處理機分配給就緒隊列中優先權最高的進程后,該進程便一直執行下去,直至完成;或因發生某事件使該進程放棄處理機時,系統方可再將處理機重新分配給另一優先權最高的進程。這種調度算法主要用於批處理系統中;也可用於某些對實時性要求不嚴的實時系統中。
2) 搶占式優先權調度算法
在這種方式下,系統同樣是把處理機分配給優先權最高的進程,使之執行。但在其執行期間,只要又出現了另一個其優先權更高的進程,進程調度程序就立即停止當前進程(原優先權最高的進程)的執行,重新將處理機分配給新到的優先權最高的進程。因此,在采用這種調度算法時,是每當系統中出現一個新的就緒進程i時,就將其優先權Pi與正在執行的進程j的優先權Pj進行比較。如果Pi≤Pj,原進程Pj便繼續執行;但如果是Pi>Pj,則立即停止Pj的執行,做進程切換,使i進程投入執行。顯然,這種搶占式的優先權調度算法能更好地滿足緊迫作業的要求,故而常用於要求比較嚴格的實時系統中,以及對性能要求較高的批處理和分時系統中。
6、Unix、Linux與Windows進程調度策略的比較
無論是在批處理系統還是分時系統中,用戶進程數一般都多於處理機數、這將導致它們互相爭奪處理機。另外,系統進程也同樣需要使用處理機。這就要求進程調度程序按一定的策略,動態地把處理機分配給處於就緒隊列中的某一個進程,以使之執行。
進程調度的實質是資源的分配,如何使系統能夠保持較短的響應時間和較高的吞吐量,如何在多個可運行的進程中選取一個最值得運行的進程投入運行是調度器的主要任務。進程調度包括兩個方面的內容:何時分配CPU 時間(調度時機)即調度器什么時候啟動;如何選擇進程(調度算法)即調度器該怎么做。進程調度主要可以分為非剝奪方式與剝奪方式兩種。
非剝奪方式:調度程序一旦把處理機分配給某進程后便讓它一直運行下去,直到進程完成或發生某事件而阻塞時,才把處理機分配給另一個進程。
剝奪方式:當一個進程正在運行時,系統可以基於某種原則,剝奪已分配給它的處理機,將之分配給其它進程。剝奪原則有:優先權原則、短進程優先原則、時間片原則。
Linux 從整體上區分實時進程和普通進程,因為實時進程和普通進程度調度是不同的,它們兩者之間,實時進程應該先於普通進程而運行,然后,對於同一類型的不同進程,采用不同的標准來選擇進程。對普通進程的調度策略是動態優先調度,對於實時進程采用了兩種調度策略,FIFO(先來先服務調度)和RR(時間片輪轉調度)。
UNIX系統是單純的分時系統,所以沒有設置作業調度。UNIX系統的進程調度采用的算法是,多級反饋隊列調度法。其核心思想是先從最高休先級就緒隊列中取出排在隊列最前面的進程,當進程執行完一個時間片仍未完成則剝奪它的執行,將它放入到相應的隊列中,取出下一個就緒進程投入運行,對於同一個隊列中的各個進程,按照時間片輪轉法調度。多級反饋隊列調度算法即能使高優先級的作業得到響應又能使短作業(進程)迅速完成。但是它還是存在某些方面的不足,當不斷有新進程到來時,則長進程可能飢餓。
Windows 系統其調度方式比較復雜,它的處理器調度的調度單位是線程而不是進程,是基於優先級的搶占式多處理器調度,依據優先級和分配時間片來調度。而且Windows 2000/XP在單處理器系統和多處理器系統中的線程調度是不同的線程調度機制,Windows操作系統的調度系統總是運行優先級最高的就緒線程。在同一優先級的各線程按時間片輪轉算法進行調度。如果一個高優先級的線程進入就緒狀態,當前運行的線程可能在用完它的時間片之前就被搶占處理機。
多任務、有線程優先級、多種中斷級別這是現代操作系統的共同特點。實時操作系統(Real-time operating system, RTOS)最大的特點是對響應時間有嚴格的要求,linux尚且不能稱為完全的實時操作系統,USA的宇宙飛船常用的操作系統是VxWorks,這才是聞名於世的RTOS。
參考鏈接:https://blog.csdn.net/fuzhongmin05/article/details/55802925