千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > Java領(lǐng)域中的線程機(jī)制-線程(二)

Java領(lǐng)域中的線程機(jī)制-線程(二)

來源:千鋒教育
發(fā)布人:qyf
時間: 2022-08-03 15:41:48 1659512508

  基本模型

1

  由于Java 中,JVM主要是由C/C++實(shí)現(xiàn),所以Java層線程最終還是會映射到JVM層線程,而Java層的線程到操作系統(tǒng)層線程就得需要看具體的JVM的具體實(shí)現(xiàn)來決定。

  一般來說,我們都把用戶線程看作更高層面的線程,而內(nèi)核線程則向用戶線程提供支持。

  由此可見,用戶線程和內(nèi)核線程之間必然存在一定的映射關(guān)系,不同的操作系統(tǒng)可能采取不同的映射方式。

  一般來說,按照映射方式來看,主要可以分為:多對一映射(用戶級方式),一對一映射(內(nèi)核級方式) 和多對多映射(組合方式)3種方式。其中:

  1. 多對一映射(用戶級方式)

  多對一映射是指多個用戶線程被映射到一個內(nèi)核線程上。每一個進(jìn)程都對應(yīng)著一個內(nèi)核線程,進(jìn)程內(nèi)的所有線程也都對應(yīng)著該內(nèi)核線程。

2

  多對一映射模型是指多條用戶線程映射同一條內(nèi)核線程的情況,其中用戶線程由庫調(diào)度器進(jìn)行調(diào)度,而內(nèi)核線程由操作系統(tǒng)調(diào)度器來完成。

  對于用戶線程而言,其會按照一定的策略輪流執(zhí)行,具體的調(diào)度算法有庫調(diào)度器完成。

  任意一個時刻每一個進(jìn)程中都只有一個用戶線程被執(zhí)行,它們的執(zhí)行都由用戶態(tài)的代碼完成切換。

  在不支持線程的操作系統(tǒng)中有庫來實(shí)現(xiàn)線程控制,用戶線程創(chuàng)建,銷毀,切換的開銷代價比內(nèi)核線程小。

  因此,這種模式特點(diǎn)主要有兩點(diǎn):

  首先,可以節(jié)省內(nèi)核態(tài)到用戶態(tài)切換的開銷

  其次,線程的數(shù)量不會受到內(nèi)核線程的限制

  但是,因?yàn)榫€程切換的工作是由用戶態(tài)的代碼完成的,所以一個進(jìn)程內(nèi),如果當(dāng)一條線程發(fā)生阻塞時,與該內(nèi)核線程對應(yīng)的進(jìn)程內(nèi)的其他所有的用戶線程也會一起陷入阻塞。

  2. 一對一映射(內(nèi)核級方式)

  一對一映射是指每個用戶線程都會被影射到一個內(nèi)核線程上,用戶的整個生命周期都綁定到所映射的內(nèi)核線程上。一個進(jìn)程內(nèi)可以有一個用戶線程和至少一個用戶線程,都對應(yīng)著各自一個和至少一個內(nèi)核線程,進(jìn)程內(nèi)的所有線程也都一一對應(yīng)著各自內(nèi)核線程。

3

  一對一映射模型是指一條用戶線程對應(yīng)著內(nèi)核中的一條線程的情況,其中用戶線程由庫調(diào)度器進(jìn)行調(diào)度,而內(nèi)核線程由操作系統(tǒng)調(diào)度器來完成,而Java中采用的就是這種模型。

  在這種方式下,多個CPU能并行執(zhí)行同一個進(jìn)程內(nèi)的多個線程。

  如果進(jìn)程內(nèi)的某個線程被阻塞,就可以切換到該進(jìn)程的其他線程繼續(xù)執(zhí)行,并且能切換執(zhí)行其他進(jìn)程的線程。

  一對一映射模型是真正意義上的并行執(zhí)行,因?yàn)檫@種模型下,創(chuàng)建一條Java的Thread線程是真正的在內(nèi)核中創(chuàng)建并映射了一條內(nèi)核線程的,執(zhí)行過程中,一條線程不會因?yàn)榱硗庖粭l線程的原因而發(fā)生阻塞等情況。

  不過因?yàn)槭敲恳粋€用線程都需要對應(yīng)一個內(nèi)核線程,這種直接映射內(nèi)核線程的模式,所以數(shù)量會存在上限。

  并且同一個核心中,多條線程的執(zhí)行需要頻繁的發(fā)生上下文切換以及內(nèi)核態(tài)與用戶態(tài)之間的切換,所以如果線程數(shù)量過多,切換過于頻繁會導(dǎo)致線程執(zhí)行效率下降。

  3. 多對多映射(組合方式)

  多對多映射是指將一對一映射(內(nèi)核級方式)和多對一映射(用戶級方式)組合起來,通過綜合兩者優(yōu)點(diǎn)來形成的一種映射方式。該方式在用戶空間創(chuàng)建,銷毀,切換,調(diào)度線程,但是進(jìn)程中的多個用戶線程會被影射到若干個內(nèi)核線程上。

4

  多對多映射模型就可以避免上面一對一映射模型和多對一映射模型帶來的弊端,也就是多條用戶線程映射多條內(nèi)核線程,這樣即可以避免一對一映射模型的切換效率問題和數(shù)量限制問題,也可以避免多對一映射模型的阻塞問題。

  每一個內(nèi)核線程負(fù)責(zé)與之綁定的若干用戶線程,進(jìn)程中的某個線程發(fā)生系統(tǒng)阻塞并不會導(dǎo)致整個進(jìn)程阻塞,而阻塞該內(nèi)核線程內(nèi)的所對應(yīng)的若干用戶線程,其他線程依舊可以照常執(zhí)行。

  同時,因?yàn)橛脩艟€程數(shù)量比內(nèi)核線程數(shù)量多,所以能有效減少內(nèi)核線程開銷。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
服務(wù)器為什么要用Linux?

服務(wù)器為什么要用Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,Linux在眾多選擇中脫穎而出。Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,有其獨(dú)特的優(yōu)勢和特點(diǎn)。包括其...詳情>>

2023-10-14 12:34:11
ORM解決的主要問題是什么?

ORM(對象關(guān)系映射)解決的主要問題是將關(guān)系數(shù)據(jù)庫與面向?qū)ο缶幊讨g的映射困境。在傳統(tǒng)的關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)以表格的形式存儲,而在面向?qū)ο?..詳情>>

2023-10-14 12:26:19
Go為什么不支持三元運(yùn)算符?

Go為什么不支持三元運(yùn)算符Go語言是一種以簡潔和有效性為目標(biāo)的編程語言,因此在設(shè)計(jì)過程中,Go的設(shè)計(jì)者刻意排除了一些他們認(rèn)為可能導(dǎo)致復(fù)雜性或...詳情>>

2023-10-14 12:12:36
IT通常說的平臺是什么意思?

在信息技術(shù)(IT)領(lǐng)域,”平臺”這個詞有著廣泛的含義,它常常指代支持軟件應(yīng)用開發(fā)和運(yùn)行的基礎(chǔ)框架和環(huán)境。以下是對”平臺”這個概念的更深入...詳情>>

2023-10-14 11:55:36
什么是PowerPivot?

什么是PowerPivotPowerPivot,全稱”PowerPivot for Excel”,是Microsoft提供的一種數(shù)據(jù)分析工具,可以作為Excel的插件使用。通過PowerPivot,...詳情>>

2023-10-14 11:25:48