調度也稱dispatcher 這是內核的主要職責之一就是決定該輪到哪一個任務運行了多數實時內核是基於優先級調度算法的每一個任務根據其重要程度的不一樣被賦予必定的優先級基於優先級的調度法指CPU 老是讓處在就緒態的優先級最高的任務先運行然而究竟什麼時候讓高優先級任務掌握CPU 的使用權有兩種不一樣的狀況這要看用的是什麼類型的內核是非佔先式仍是佔先式的內核一個良好的任務調度算法應該主要體如今如下幾個方面算法
公平保證每一個進程獲得合理的CPU 時間
高效使CPU 保持忙碌狀態即老是有進程在CPU 上運行
響應時間使交互用戶的響應時間儘量短
週轉時間使批處理用戶等待輸出的時間儘量短
吞吐量使單位時間內處理的進程儘量多
很顯然在任何操做系統中這幾個目標不可能同時達到因此不一樣的
操做系統會在這幾個方面中作出相應的取捨從而肯定本身的調度算法,經常使用的處理機調度算法有:
先來先服務FCFS
短做業優先SJF
優先級
時間片輪轉法
多級隊列法
多級反饋隊列法
先來先服務:FCFS 是最簡單的CPU 調度算法,即按進程到來的前後次序進行調度,這樣在系統中等待時間最長的進程被優先調度,而無論其所需運行時間的長短。spa
做業優先SJF 算法是指當CPU 可供使用時SJF 算法把CPU 分給須要運行時間最短的進程。
多級隊列調度算法:把就緒隊列劃分紅幾個單獨的隊列通常根據進程的某些特性如內存大小和進程類型永久性地把各個進程分別鏈入其中某一個隊列中,每一個隊列都有本身的調度算法,此外在各個隊列之間也要進行調度。一般採用固定優先級的搶佔式調度,例如某系統中有5 個隊列,各個隊列的優先級自上而降低低,只有當前3 個隊列中都爲空的時候隊列4 中的進程才能夠運行,而當隊列4 中的進程在運行時,若是隊列1 中進入了一個就緒進程,則隊列4 中的進程要馬上讓出CPU 使用權。多級反饋隊列法容許進程在各隊列間移動,其基本思想是把具備不一樣CPU工做時間這一特性的進程區分開來,若是一個進程要使用很長的CPU 時間,則應把它移至較低級的隊列中,這種方式把I/O 繁忙型和交互式進程放在較高優先級的隊列中一樣在低優先級隊列中長時間等待的進程能夠移到較高優先級隊列中UNIX 系統採用的是多級反饋隊列輪轉法。
時間片輪轉調度法:round-robin scheduling
當兩個或兩個以上任務有一樣優先級,內核容許一個任務運行事先肯定的一段時間叫作時間額度quantum ,而後切換給另外一個任務也叫作時間片調度time slicing ,內核在知足如下條件時把CPU 控制權交給下一個任務就緒態的任務, 當前任務已無事可作,當前任務在時間片還沒結束時已經完成了。輪轉法主要是爲分時系統設計的,其中時間片是一個重要的參數不能取的過大或太小,一般爲10 至100ms 數量級,就緒隊列能夠當作是一個環形隊列,CPU 調度程序輪流地把CPU 分給就緒隊列中地每一個進程,時間長度爲一個時間片Linux 操做系統就是採用時間片輪轉的調度算法。操作系統