搞定線程與進程的調度算法只需三分鐘

java中的線程與進程調度

線程調度

搶佔式調度

​ 每個線程執行的時間、線程的切換都由系統控制,系統控制是值在系統某種運行機制下,可能每條線程都分同樣的執行時間片,也可能是某些線程執行的時間片比較長,升值某些線程得不到執行的時間片。在這種機制下,一個線程的阻塞不會導致整個進程阻塞

協同式調度

​ 某一線程執行完畢後主動通知系統切換到另一個線程上執行,這種模式就像是接力賽一樣。

​ 線程的執行時間由線程本身控制,線程切換可以預知,不存在多線程同步問題

  • 缺點:如果一個線程編寫有問題,運行到一般就一直阻塞,那麼可能導致整個系統崩潰

搶佔式調度(JVM的線程調度實現)

​ java使用的線程調度使用的是搶佔式調度,java中線程會按優先級分配CPU時間片運行,且優先級越高,越優先執行,但優先級高並不代表能獨自佔用執行時間片,可能是優先級高得到越多的執行時間片,反之,優先級低的分到的執行時間少但不會分配不到執行時間

線程讓出CPU的情況

  • 當前運行線程主動放棄CPU,JVM暫時放棄CPU操作(基於時間片輪轉調度的JVM操作系統不會讓線程永久放棄CPU,或者說放棄本次時間片的執行權,例如嗲用yield()方法)
  • 當前運行線程因爲某些原因進入阻塞狀態。例如阻塞在I/O
  • 當前運行線程結束,即運行完run()裏面的任務

進程調度算法

優先調度算法

先來先服務調度算法(FCFS)

​ 每次調度是從就緒隊列中選擇一最先進入該隊列的進程,爲之分配處理機,使之投入運行。該進程一直運行到完成或發生某事件而阻塞後才放棄處理機

特點:算法比較簡單,可以實現基本上的公平

短作業(進程)優先調度算法(SJF)

​ 是從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它,使它立即執行並一直執行到完成,或發生某事件而被阻塞放棄處理機時再重新調度。該算法未照顧緊迫型作業。

高優先權優先調度算法

​ 爲了照顧緊迫型作業,引入了最高優先權優先(FPF)調度算法。系統將從後備隊列中選擇若干個優先權最高的作業裝入內存。當用於進程調度時,該算法是把處理機分配給就緒隊列中優先權最高的進程

非搶佔式優先權算法

​ 系統一旦把處理機分配給就緒隊列中優先權最高的進程後,該進程便一直執行下去,直至完成。或因發生某時間使該進程放棄處理機時,這種調度算法主要用於批處理系統中。也可用於某些對實時性要求不嚴的實時系統中

搶佔式優先權調度算法

​ 在這種方式下,系統通用是吧處理機分配給優先權最高的進程,使之執行。但在其執行期間,只要出現優先權更高的進程,進程調度程序就立即停止當前進程的執行,重新將處理機進行分配。

高相應比優先調度算法

​ 在批處理系統中,短作業優先算法是一種比較好的算法,其主要的不足之處是長作業的運行得不到保證,如果我們能爲每個作業引入前面所述的動態優先權,並使作業的優先級隨着等待時間而增加。

此時優先權:

  • 如果作業的等待時間相同,則要求服務的時間越短,其優先級越高,有利於短作業
  • 如果要求服務的時間相同時,作業優先權決定與等待時間,等待時間越長,其優先權越高
  • 對於長作業,作業的優先級會隨着等待時間的增加而增加,當其等待時間足夠長時,其優先級會很高。
  • 但是在進行調度之前,需要先做響應比的計算,會在一定程度上增加系統開銷。

基於時間片的轉輪調度算法

時間片輪轉法

​ 在早起的時間片輪轉法中,系統將所有的就緒線程按先來先服務的原則排成一個個隊列,每次調度時,把CPU分配給隊首進程,並令其執行一個時間片。

​ 當執行的時間片用完時,由一個計時器發出時鐘中斷請求,調度程序便根據此信號來停止該進程的執行,並將它送到就緒隊列的末尾,然後再把處理機分配給就緒隊列中心的隊首進程,同時讓它執行一個時間片。

​ 這樣就保證就緒隊列中的所有進程在以給定的時間內均能獲得一時間片的處理機執行時間

多級反饋隊列調度算法

​ 應設置多個就緒隊列,併爲各隊列賦予不同的優先級,第一隊列的優先級最高,第二隊列其次。該算法賦予各個大院裏中進程執行時間片的大小也更不相同,在優先權越高的隊列中,爲每個進程所規定的執行時間片越小。

​ 當一個新進程進入內存後,首先將它放入第一隊列的末尾,按照FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,便可準備撤離系統,如果它在一個時間片結束時尚未完成,調度程序便將改進程轉入第二隊列的末尾,再按照FCFS原則等待調度執行

進程執行時,如它能在該時間片內完成,便可準備撤離系統,如果它在一個時間片結束時尚未完成,調度程序便將改進程轉入第二隊列的末尾,再按照FCFS原則等待調度執行

​ 僅當第一隊列空閒時,調度程序才調度第二隊列中的進程運行;僅當第 1~(i-1)隊列均空時,纔會調度第 i 隊列中的進程運行。如果處理機正在第 i 隊列中爲某進程服務時,又有新進程進入優先權較高的隊列(第 1~(i-1)中的任何一個隊列),則此時新進程將搶佔正在運行進程的處理機,即由調度程序把正在運行的進程放回到第 i 隊列的末尾,把處理機分配給新到的高優先權進程

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