溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java的調(diào)度機(jī)制怎么理解

發(fā)布時間:2022-01-12 15:56:18 來源:億速云 閱讀:133 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Java的調(diào)度機(jī)制怎么理解”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強(qiáng),希望這篇“Java的調(diào)度機(jī)制怎么理解”文章能幫助大家解決問題。

CPU核心數(shù),線程數(shù)

CPU個數(shù)、核心數(shù)、線程數(shù)的關(guān)系:

  • CPU個數(shù):是指物理上,即硬件上的核心數(shù);

  • 核心數(shù):是邏輯上的,簡單理解為邏輯上模擬出的核心數(shù);

  • 線程數(shù):是同一時刻設(shè)備能并行執(zhí)行的程序個數(shù),線程數(shù) = cpu個數(shù) * 核數(shù);

CPU線程數(shù)和Java多線程概念:

  • 單個CPU線程在同一時刻只能執(zhí)行單一Java程序,也就是一個線程

  • 單個線程同時只能在單個CPU線程中執(zhí)行

  • 線程是操作系統(tǒng)最小的調(diào)度單位,進(jìn)程是資源(比如:內(nèi)存)分配的最小單位

  • Java中的所有線程在JVM進(jìn)程中,CPU調(diào)度的是進(jìn)程中的線程

  • Java多線程并不是由于CPU線程數(shù)為多個才稱為多線程,當(dāng)Java線程數(shù)大于CPU線程數(shù),操作系統(tǒng)使用時間片機(jī)制,采用線程調(diào)度算法,頻繁的進(jìn)行線程切換。

IO阻塞時,線程會釋放CPU嗎?

當(dāng)線程處于IO操作時,線程是阻塞的,線程由運(yùn)行狀態(tài)切換到等待狀態(tài)。此時CPU會做上下文切換,以便處理其他程序;當(dāng)IO操作完成后,CPU會收到一個來自硬盤的中斷信號,CPU正在執(zhí)行的線程因此會被打斷,回到ready隊列。而先前因I/O而waiting的線程隨著I/O的完成也再次回到就緒隊列,此時CPU可能會選擇他執(zhí)行。

JAVA中并發(fā)和并行的概念

并行:指兩個或多個事件在同一時刻點發(fā)生,CPU同時執(zhí)行;并發(fā):指兩個或多個事件在同一時間段內(nèi)發(fā)生,CPU交替執(zhí)行;

JAVA線程可以同時在多個核上運(yùn)行嗎?(思考)

操作系統(tǒng)是基于線程調(diào)度的,在同一時刻,JAVA進(jìn)程中不同的線程可能會在不同的核上并行運(yùn)行。

線程是調(diào)度的最小單位,而進(jìn)程是資源(比如:內(nèi)存)分配的最小單位。 

時間片輪轉(zhuǎn)機(jī)制

時間片輪轉(zhuǎn)法(Round-Robin,RR):

根據(jù)先進(jìn)先出原則,排成隊列(就緒隊列),調(diào)度時,將CPU分配給隊首進(jìn)程,讓其執(zhí)行一個時間段(稱為:時間片),時間片通常為10-100ms數(shù)量級,當(dāng)執(zhí)行的時間片用完時,會由計時器發(fā)出時鐘中斷請求,調(diào)度程序便據(jù)此來停止該進(jìn)程的執(zhí)行,并將它排到隊列末尾,然后再把CPU重新分配給當(dāng)前隊列的隊首進(jìn)程,同理如此往復(fù)。

時間片大小取決于:

    1. 系統(tǒng)對響應(yīng)時間的要求

    1. 就緒隊列中進(jìn)程的數(shù)目

    1. 系統(tǒng)的處理能力

進(jìn)程調(diào)度

采用此算法的系統(tǒng),其程序就緒隊列往往按進(jìn)程到達(dá)的時間來排序。進(jìn)程調(diào)度程序總是選擇就緒隊列中的第一個進(jìn)程,也就是說按照先來先服務(wù)原則調(diào)度,但一旦進(jìn)程占用處理機(jī)則僅使用一個時間片。在使用一個時間片后,進(jìn)程還沒有完成其運(yùn)行,它必須釋放出處理機(jī)給下一個就緒的進(jìn)程,而被搶占的進(jìn)程返回到就緒隊列的末尾重新排隊等待再次運(yùn)行。

處理器同一個時間只能處理一個任務(wù)。處理器在處理多任務(wù)的時候,就要看請求的時間順序,如果時間一致,就要進(jìn)行預(yù)測。挑到一個任務(wù)后,需要若干步驟才能做完,這些步驟中有些需要處理器參與,有些不需要(如磁盤控制器的存儲過程)。不需要處理器處理的時候,這部分時間就要分配給其他的進(jìn)程。原來的進(jìn)程就要處于等待的時間段上。經(jīng)過周密分配時間,宏觀上就象是多個任務(wù)一起運(yùn)行一樣,但微觀上是有先后的,就是時間片輪換。

實現(xiàn)思想

時間片輪轉(zhuǎn)算法的基本思想是,系統(tǒng)將所有的就緒進(jìn)程按先來先服務(wù)算法的原則,排成一個隊列,每次調(diào)度時,系統(tǒng)把處理機(jī)分配給隊列首進(jìn)程,并讓其執(zhí)行一個時間片。當(dāng)執(zhí)行的時間片用完時,由一個計時器發(fā)出時鐘中斷請求,調(diào)度程序根據(jù)這個請求停止該進(jìn)程的運(yùn)行,將它送到就緒隊列的末尾,再把處理機(jī)分給就緒隊列中新的隊列首進(jìn)程,同時讓它也執(zhí)行一個時間片 

Java調(diào)度機(jī)制

所有的Java虛擬機(jī)都有一個線程調(diào)度器,用來確定哪個時刻運(yùn)行哪個線程。主要包含兩種:搶占式線程調(diào)度器和協(xié)作式線程調(diào)度器。

  • 搶占式線程調(diào)度: 每個線程可能會有自己的優(yōu)先級,但是優(yōu)先及并不意味著高優(yōu)先級的線程一定會被調(diào)度,而是由CPU隨機(jī)的選擇,所謂搶占式的線程調(diào)度,就是說一個線程在執(zhí)行自己的任務(wù)時,雖然任務(wù)還沒有執(zhí)行完,但是CPU會迫使它暫停,讓其它線程占有CPU的使用權(quán)。

  • 協(xié)作式線程調(diào)度: 每個線程可以有自己的優(yōu)先級,但優(yōu)先級并不意味著高優(yōu)先級的線程一定會被最先調(diào)度,而是由cpu時機(jī)選擇的,所謂協(xié)作式的線程調(diào)度,就是說一個線程在執(zhí)行自己的任務(wù)時,不允許被中途打斷,一定等當(dāng)前線程將任務(wù)執(zhí)行完畢后才會釋放對cpu的占有,其它線程才可以搶占該cpu。

兩者對比:

搶占式線程調(diào)度不易發(fā)生饑餓現(xiàn)象,不易因為一個線程的問題而影響整個進(jìn)程的執(zhí)行,但是其頻繁阻塞與調(diào)度,會造成系統(tǒng)資源的浪費(fèi)。協(xié)作式的線程調(diào)度很容易因為一個線程的問題導(dǎo)致整個進(jìn)程中其它線程饑餓。

總結(jié):

  • Java在調(diào)度機(jī)制上采用的是搶占式的線程調(diào)度機(jī)制。

  • Java線程在運(yùn)行的過程中多個線程之間是協(xié)作式的。

關(guān)于“Java的調(diào)度機(jī)制怎么理解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI