1、Java線程調度算法
1.搶佔式調度:指的是每條線程執行的時間、線程的切換都由系統控制。系統控制指的是在系統某種運行機制下,可能每條線程都分一樣的執行時間片,也多是某些線程執行的時間片較長,甚至某些線程得不到執行的時間片。在這種機制下,一個線程的堵塞不會致使整個進程堵塞。多線程
2.協同式調度:指某一線程執行完後主動通知系統切換到另外一線程上執行。線程的執行時間由線程自己控制,線程切換能夠預知,不存在多線程同步問題,但它有一個致命缺點:若是一個線程編寫有問題,運行到一半就一直阻塞,那麼可能致使整個系統崩潰。dom
3.JVM的線程調度的實現(搶佔式調度):Java使用的線程調度使用搶佔式調度,Java中線程會按優先級分配CPU時間片運行,且優先級越高越優先執行,但優先級高並不表明能獨自佔用執行時間片,多是優先級高獲得越多的執行時間片,反之,優先級低的分到的執行時間少但不會分配不到執行時間。性能
4.線程讓出CPU的狀況:spa
1)當前運行線程主動放棄CPU,JVM暫時放棄CPU操做(基於時間片輪轉調度的JVM操做系統不會讓線程永久放棄CPU,或者說放棄本次時間片的執行權),例如調用yield方法。操作系統
2)當前運行線程由於某些緣由進入阻塞狀態,例如阻塞在IO上。線程
3)當前運行線程結束,即運行完run方法裏面的任務。code
實例:blog
1 public class TestScheduledThreadPool { 2 public static void main(String[] args) throws Exception { 3 ScheduledExecutorService pool = Executors.newScheduledThreadPool(5); 4 for (int i = 0; i < 5; i++) { 5 Future<Integer> result = pool.schedule(new Callable<Integer>(){ 6 public Integer call() throws Exception { 7 int num = new Random().nextInt(100);//生成隨機數
8 System.out.println(Thread.currentThread().getName() + " : " + num); 9 return num; 10 } 11 }, 1, TimeUnit.SECONDS); 12 System.out.println(result.get()); 13 } 14 pool.shutdown(); 15 } 16 }
2、進程調度算法隊列
1.優先調度算法
1)先來先服務調度算法(FCFS):當在做業調度中採用該算法時,每次調度都是從後備做業隊列中選擇一個或多個最早進入該隊列的做業,將它們調入內存,爲它們分配資源、建立進程,而後放入就緒隊列。在進程調度中採用FCFS算法時,則每次調度是從就緒隊列中選擇一個最早進入該隊列的進程,爲之分配處理機,使之投入運行。該進程一直運行到完成或發生某事件而阻塞後才放棄處理機,特色是:算法比較簡單,能夠實現基本上的公平。
2)短做業(進程)優先調度算法(SJF):是從後備隊列中選擇一個或若干個估計運行時間最短的做業,將它們調入內存運行。而短做業優先調度算法則是從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它,使它當即執行並一直執行到完成,或發生某事件而被阻塞放棄處理機時再從新調度。該算法未照顧緊迫型做業。
2.高優先權優先調度算法
爲了照顧緊迫型做業,使之在進入系統後便得到優先處理,引入了最高優先權(FPF)優先調度算法。當把該算法用於做業調度時,系統將從後備隊列中選擇若干個優先權最高的做業裝入內存。當用於進程調度時,該算法時把處理機分配給就緒隊列中優先權最高的進程。
1)非搶佔式優先權算法:在這種方式下,系統一旦把處理機分配給就緒隊列中優先權最高的進程後,該進程便一直執行下去,直至完成;或因發生某事件使該進程放棄處理機時。這種調度算法主要用於批處理系統中,也可用於某些對實時性要求不嚴的實時系統中。
2)搶佔式優先權調度算法:在這種方式下,系統一樣是把處理機分配給優先權最高的進程,使之執行。但在其執行期間,只要又出現了另外一個其優先權更高的進程,進程調度就當即中止當前進程(原優先權最高的進程)的執行,從新將處理機分配給新到的優先權最高的進程。顯然,這種搶佔式的優先權調度算法能更好地知足緊迫做業的要求,故而經常使用於比較嚴格的實時系統中,以及對性能要求較高的批處理系統和分時系統中。
3)高響應比優先調度算法:在批處理系統中,短做業優先算法是一種比較好的算法,其主要的不足之處是長做業的運行得不到保證。若是咱們能爲每一個做業引入前面所述的動態優先權,並使做業的優先級隨着等待時間的增長而以速率a提升,則長做業在等待必定時間後,必然有機會分配處處理機。該優先權的變化規律可描述爲:
a. 若是做業地等待時間相同,則要求服務的時間愈短,其優先權愈高,於是該算法有利於短做業。
b. 當要求服務的時間相同時,做業的優先權決定與其等待時間,等待時間越長,其優先權越高,於是它實現的是先來先服務。
c. 對於長做業,做業的優先級能夠隨等待時間的增長而增長,當其等待時間足夠長時,其優先級即可升到很高,從而也可得到處理機。該算法既照顧了短做業,又考慮了做業到達的前後次序,不會使長做業長期得不到服務。所以,該算法實現了一種較好的折中。固然,在利用該算法時,每要進行調度以前按,都須先作響應比的計算,這會增長系統開銷。
3.基於時間片的輪轉調度算法
1)時間片輪轉法:在早期的時間片輪轉法中,系統將全部的就緒進程按先來先服務的原則排成一個隊列,每次調度時,把CPU分配給隊首進程,並令其執行一個時間片。時間片的大小從幾ms到幾百ms。當執行的時間片用完時,由一個計時器發出時鐘中斷請求,調度程序便據此信號來中止該進程的執行,並將它送往就緒隊列的末尾;而後,再把處理機分配給就緒隊列中新的隊首進程,同時也讓它執行一個時間片。這樣就能夠保證就緒隊列中的全部進程在一給定的時間內均得到一時間片的處理機執行時間。
2)多級反饋隊列調度算法
a. 應設置多個就緒隊列,併爲各個隊列賦予不一樣的優先級。第一個隊列的優先級最高,第二個隊列次之,其他各隊列的優先權逐個下降。該算法賦予各個隊列中進程執行時間片的大小也各不相同,在優先權越高的隊列中,爲每一個進程所規定的執行時間片就越小。例如,第二隊列的時間片要比第一個隊列的時間片長一倍,......,第i+1個隊列的時間片要比i個隊列的時間片長一倍。
b. 當一個新進程進入內存後,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,若是它能在該時間片內完成,即可準備撤離系統;若是它在一個時間片結束時還沒有完成,調度程序便將該進程轉入第二隊列的末尾。再一樣地按FCFS原則等待調度執行;若是它在第二隊列中運行一個時間片後仍未完成,再依次將它放入第三隊列,......,如此下去,當一個長做業從第一隊列依次降到第n隊列後,在第n隊列便採起按時間片輪轉的方式運行。
c. 僅當第一隊列空閒時,調度程序下才調度第二隊列中的進程運行;僅當第1~(i-1)隊列均空時,纔會調度第i隊列中的進程運行。若是處理機正在第i隊列中爲某進程服務時,又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶佔正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優先權進程。再多級反饋隊列調度算法中,若是規定第一個隊列的時間片略大於多數人機交互所需之處理時間時,便可以較好的知足各類類型用戶的須要。