CPU核心數,線程數,時間片輪起色制解讀


點擊上方藍字關注咱們,瞭解更多內容

CPU核心數,線程數

CPU個數、核心數、線程數的關係:

  • CPU個數:是指物理上,即硬件上的核心數;web

  • 核心數:是邏輯上的,簡單理解爲邏輯上模擬出的核心數;算法

  • 線程數:是同一時刻設備能並行執行的程序個數,線程數 = cpu個數 * 核數;微信

CPU線程數和Java多線程概念:

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

  • 單個線程同時只能在單個CPU線程中執行併發

  • 線程是操做系統最小的調度單位,進程是資源(好比:內存)分配的最小單位app

  • Java中的全部線程在JVM進程中,CPU調度的是進程中的線程編輯器

  • Java多線程並非因爲CPU線程數爲多個才稱爲多線程,當Java線程數大於CPU線程數,操做系統使用時間片機制,採用線程調度算法,頻繁的進行線程切換。flex

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

當線程處於IO操做時,線程是阻塞的,線程由運行狀態切換到等待狀態。此時CPU會作上下文切換,以便處理其餘程序;當IO操做完成後,CPU會收到一個來自硬盤的中斷信號,CPU正在執行的線程所以會被打斷,回到ready隊列。而先前因I/O而waiting的線程隨着I/O的完成也再次回到就緒隊列,此時CPU可能會選擇他執行。ui

JAVA中併發和並行的概念

並行:指兩個或多個事件在同一時刻點發生,CPU同時執行;併發:指兩個或多個事件在同一時間段內發生,CPU交替執行;spa

JAVA線程能夠同時在多個核上運行嗎?(思考)

操做系統是基於線程調度的,在同一時刻,JAVA進程中不一樣的線程可能會在不一樣的核上並行運行。

線程是調度的最小單位,而進程是資源(好比:內存)分配的最小單位。

時間片輪起色制

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

根據先進先出原則,排成隊列(就緒隊列),調度時,將CPU分配給隊首進程,讓其執行一個時間段(稱爲:時間片),時間片一般爲10-100ms數量級,當執行的時間片用完時,會由計時器發出時鐘中斷請求,調度程序便據此來中止該進程的執行,並將它排到隊列末尾,而後再把CPU從新分配給當前隊列的隊首進程,同理如此往復。

時間片大小取決於:

    1. 系統對響應時間的要求

    1. 就緒隊列中進程的數目

    1. 系統的處理能力

進程調度

採用此算法的系統,其程序就緒隊列每每按進程到達的時間來排序。進程調度程序老是選擇就緒隊列中的第一個進程,也就是說按照先來先服務原則調度,但一旦進程佔用處理機則僅使用一個時間片。在使用一個時間片後,進程尚未完成其運行,它必須釋放出處理機給下一個就緒的進程,而被搶佔的進程返回到就緒隊列的末尾從新排隊等待再次運行。

處理器同一個時間只能處理一個任務。處理器在處理多任務的時候,就要看請求的時間順序,若是時間一致,就要進行預測。挑到一個任務後,須要若干步驟才能作完,這些步驟中有些須要處理器參與,有些不須要(如磁盤控制器的存儲過程)。不須要處理器處理的時候,這部分時間就要分配給其餘的進程。原來的進程就要處於等待的時間段上。通過周密分配時間,宏觀上就象是多個任務一塊兒運行同樣,但微觀上是有前後的,就是時間片輪換。

實現思想

時間片輪轉算法的基本思想是,系統將全部的就緒進程按先來先服務算法的原則,排成一個隊列,每次調度時,系統把處理機分配給隊列首進程,並讓其執行一個時間片。當執行的時間片用完時,由一個計時器發出時鐘中斷請求,調度程序根據這個請求中止該進程的運行,將它送到就緒隊列的末尾,再把處理機分給就緒隊列中新的隊列首進程,同時讓它也執行一個時間片


Java調度機制

全部的Java虛擬機都有一個線程調度器,用來肯定哪一個時刻運行哪一個線程。主要包含兩種:搶佔式線程調度器和協做式線程調度器。

  • 搶佔式線程調度: 每一個線程可能會有本身的優先級,可是優先及並不意味着高優先級的線程必定會被調度,而是由CPU隨機的選擇,所謂搶佔式的線程調度,就是說一個線程在執行本身的任務時,雖然任務尚未執行完,可是CPU會迫使它暫停,讓其它線程佔有CPU的使用權。

  • 協做式線程調度: 每一個線程能夠有本身的優先級,但優先級並不意味着高優先級的線程必定會被最早調度,而是由cpu時機選擇的,所謂協做式的線程調度,就是說一個線程在執行本身的任務時,不容許被中途打斷,必定等當前線程將任務執行完畢後纔會釋放對cpu的佔有,其它線程才能夠搶佔該cpu。

二者對比:

搶佔式線程調度不易發生飢餓現象,不易由於一個線程的問題而影響整個進程的執行,可是其頻繁阻塞與調度,會形成系統資源的浪費。協做式的線程調度很容易由於一個線程的問題致使整個進程中其它線程飢餓。

總結:

  • Java在調度機制上採用的是搶佔式的線程調度機制。

  • Java線程在運行的過程當中多個線程之間協做式的。



夯實基礎,關注前沿,娛樂生活

掌握更多前沿技術,獲取更多笑點 

請關注--------喘口仙氣



本文分享自微信公衆號 - 喘口仙氣(gh_db8538619cdd)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索