先來先服務算法
最簡單的一種調度算法是先來先服務算法(First Come First Served,FCFS),也叫做先進先出算法(First In First Out,FIFO)。
優點:簡單,易於理解和實現。
缺點:一批任務的平均周轉時間取決於各個任務到達的順序,如果短任務位於長任務之后,那么將增大平均周轉時間。
短作業優先算法
為了改進FCFS算法,減少平均周轉時間,人們提出了短作業優先算法(Shortest Job First,SJF)。SJF算法的基本思路是:各個任務在開始執行之前,必須事先預計好它的執行時間,然后調度器將根據這些時間,從中選擇用時較短的任務優先執行。
SJF算法有兩種:不可搶占方式和可搶占方式。其中可搶占方式又叫最短剩余時間優先算法(Shortest Remaining Time First,SRTF)。
時間片輪轉算法
時間片輪轉算法(Round Robin,RR)的基本思路是:把系統當中的所有就緒任務按照先來先服務的原則,排成一個隊列,然后再每次調度的時候,把處理器分派給隊列當中的第一個任務,讓它去執行一小段CPU時間(即時間片,time slice)。當這個時間片結束時,如果任務還沒有執行完成的話,將會發生時鍾中斷,在時鍾中斷里面,調度器將會暫停當前任務的執行,並把它送到就緒隊列的末尾,然后執行當前的隊首任務。反之,如果一個任務在它的時間片用完之前就已經結束了或者阻塞了,那么它就會立即讓出CPU給其他任務。
圖3-25所示是時間片輪轉法的示意圖。圖a表示初始狀態,總共有四個任務位於就緒隊列中,先后順序是B、C、D、A,其中任務B位於隊列之首。當CPU空閑時,調度器就會選擇B去執行。假設當B運行完一個時間片后,即沒有結束也沒有被阻塞,這時操作系統就會通過時鍾中斷來中止它的運行,並把它送到就緒隊列的末尾。於是就成了圖b的狀態,此時,C位於隊列之首,C就被調度執行。當C時間片用完后也會送到隊列末尾,以此內推。當某個任務運行結束了,就會退出就緒隊列,或者某任務被阻塞也也會退出,並加入阻塞隊列中去。
優點:公平性,各個就緒任務能得到相同的時間片;活動性,每個就緒任務能一直保持活動。
缺點:時間片的大小q要適當選取,如果選擇不當,將會影響到系統的性能和效率。如果q太大,每個任務都在一個時間片內完成,這就退化為先來先服務算法了。如果q太小,每個任務需要更多的時間片才能運行結束,這就使任務之間的切換次數增加,從而增大了系統的管理開銷,降低了CPU的使用效率。一般來說,q值選取在20ms~50ms比較合適。
另,時間片輪轉算法屬於可搶占式調度。
優先級算法
優先級調度算法(priority)的基本思路是:給每個任務都設置一個優先級,然后在任務調度的時候,在所有處於就緒狀態的任務中選擇優先級最高的任務去運行。上文提到的短作業優先算法其實也是一種優先級算法,每個任務的優先級就是它的運行時間,運行時間越短,優先級越高。
優先級算法可以分為可搶占方式和不可搶占方式。區別在於,一個任務正在運行時,如果來了一個優先級更高的任務,可搶占方式則會立即搶占CPU去運行高優先級的任務,不可搶占方式則會等當前任務運行結束后再執行。
在任務優先級的確定方式上,可以分為靜態方式和動態方式。
靜態優先級方式:在創建任務的時候就確定任務的優先級,並且一直保持不變直到任務結束。
動態優先級方式:任務的優先級在任務運行過程中可以動態改變。
在優先級算法中,高優先級的任務將搶占低優先級的任務,但如果兩個任務的優先級相同,又該如何處理呢?通常的做法是把任務按照不同的優先級進行分組,然后在不同組之間使用優先級算法,在同一組的各個任務之間使用時間片輪轉法。(如圖)
參考資料:《嵌入式系統設計師》3.3.4章節 任務的調度
轉自:https://blog.csdn.net/yannanxiu/java/article/details/52738580