溫馨提示×

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

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

Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些

發(fā)布時(shí)間:2022-07-29 14:02:12 來(lái)源:億速云 閱讀:145 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

一、現(xiàn)代計(jì)算機(jī)硬件結(jié)構(gòu)

Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些

 核心部分: CPU、內(nèi)存

1.CPU內(nèi)部結(jié)構(gòu)

Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些

  • 控制單元: 整個(gè) CPU 的指揮控制中心

  • 運(yùn)算單元: 運(yùn)算器核心,執(zhí)行算術(shù)運(yùn)算與邏輯運(yùn)算。運(yùn)算器接收控制單元的指令而執(zhí)行動(dòng)作

  • 存儲(chǔ)單元: CPU 中暫時(shí)存儲(chǔ)數(shù)據(jù)的地方,包括 CPU 片內(nèi)緩存 Cache 和 寄存器組

1.1.CPU緩存結(jié)構(gòu)

現(xiàn)代 CPU 為了提升執(zhí)行效率,減少 CPU 與內(nèi)存的交互(交互影響 CPU 效率),一般在 CPU上集成了多級(jí)緩存架構(gòu),常見(jiàn)的為三級(jí)緩存結(jié)構(gòu)

  • L1 Cache,分為數(shù)據(jù)緩存和指令緩存,邏輯核獨(dú)占

  • L2 Cache,物理核獨(dú)占,邏輯核共享

  • L3 Cache,所有物理核共享

Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些

此機(jī)器的三級(jí)緩存架構(gòu)如下圖:L1 Cache又分為兩種,指令存儲(chǔ)單元(存指令),和邏輯存儲(chǔ)單元(存邏輯)。理論上一臺(tái)機(jī)器可以有多個(gè) CPU,由插槽決定,一個(gè) CPU 又有多核,一個(gè)核又可以由多個(gè)邏輯處理器。

Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些

寄存器是 CPU 內(nèi)部元件,讀寫(xiě)速度非???。 CPU 讀取數(shù)據(jù)只會(huì)從寄存器中去取,每個(gè) CPU 都有一個(gè)獨(dú)有的寄存器,其他 CPU 無(wú)法訪(fǎng)問(wèn)。采用寄存器,可以減少 CPU 訪(fǎng)問(wèn)內(nèi)存的次數(shù),從而提高了 CPU 的工作速度。

越靠近 CPU 讀取速度越快,摩爾定律中,CPU 以每18個(gè)月翻一番的速度在發(fā)展,而內(nèi)存和硬盤(pán)的發(fā)展速度遠(yuǎn)遠(yuǎn)跟不上。為了解決 CPU 運(yùn)算速度和 I\O 速度不匹配的問(wèn)題,CPU 開(kāi)始被內(nèi)置了少量的高速緩存 Lx Cache(CPU空間有限,存儲(chǔ)元件大小受限)。

  • 存儲(chǔ)器存儲(chǔ)空間大?。?內(nèi)存 > L3 Cache > L2 Cache > L1 Cache > 寄存器

  • 存儲(chǔ)器讀取速度快慢: 寄存器 > L1 Cache > L2 Cache > L3 Cache > 內(nèi)存

  • 緩存是由最小的存儲(chǔ)區(qū)塊--- 緩存行(CacheLine) 組成,緩存行大小通常為64byte。我的機(jī)器L1的緩存大小時(shí)512K,則由512 * 1024/64個(gè)緩存行組成。

CPU讀取存儲(chǔ)器數(shù)據(jù)過(guò)程: CPU 僅能直接從寄存器中獲取數(shù)據(jù)。 假設(shè)數(shù)據(jù) x = 0 在內(nèi)存中,則它的取值過(guò)程如下:

判斷寄存器中是否存在

不存在則遍歷L1 Cache 看是否存在,不存在遍歷L2 Cache,L2 Cache 中沒(méi)有,遍歷L3 Cache。中間過(guò)程存在,則會(huì)把 Cache 行鎖住,拷貝到上一級(jí),直至到寄存器。

Cache 中沒(méi)有則區(qū)內(nèi)存中找,先通知內(nèi)存控制器占用總線(xiàn)帶寬,通知內(nèi)存加鎖,發(fā)起內(nèi)存讀請(qǐng)求,等待回應(yīng),回應(yīng)數(shù)據(jù)拷貝到L3 Cache。 注意:整個(gè)過(guò)程加鎖直至到CPU才會(huì)解開(kāi)

局部性原理:在CPU訪(fǎng)問(wèn)存儲(chǔ)設(shè)備時(shí),無(wú)論是存取數(shù)據(jù)還是存取指令,都趨于聚集在一片連續(xù)的區(qū)域中。

這種局部性原理又有兩種:

  • 時(shí)間局部性(Temporal Locality): 如果一個(gè)信息項(xiàng)正在被訪(fǎng)問(wèn),那么在近期它很可能還會(huì)被再次訪(fǎng)問(wèn)。 比如循環(huán)、遞歸、方法的反復(fù)調(diào)用等。

  • 空間局部性(Spatial Locality): 如果一個(gè)存儲(chǔ)器的位置被引用,那么將來(lái)他附近的位置也會(huì)被引用。 比如順序執(zhí)行的代碼、連續(xù)創(chuàng)建的兩個(gè)對(duì)象、數(shù)組等。

空間局部性的例子: 一個(gè)很大的二維數(shù)組,累加求和一行一行加會(huì)比一列一列累加快很多。在CPU 在內(nèi)存中讀取數(shù)據(jù)時(shí)會(huì)將附件的數(shù)據(jù)都讀進(jìn)去。

1.2.CPU運(yùn)行安全等級(jí)

CPU被劃分為 4 個(gè)運(yùn)行級(jí)別:

  •  ring0 內(nèi)核態(tài)

  •  ring1

  •  ring2

  •  ring3 用戶(hù)態(tài)

Linux 和 Windows 都只用到了兩個(gè)級(jí)別:ring0、ring3,操作系統(tǒng)內(nèi)部?jī)?nèi)部程序指令通常運(yùn)行在 ring0 級(jí)別,操作系統(tǒng)以外的第三方程序運(yùn)行在 ring3 級(jí)別,第三方程序如果要調(diào)用操作系統(tǒng)內(nèi)部函數(shù)功能,由于運(yùn)行安全級(jí)別不夠,必須切換CPU運(yùn)行狀態(tài),從 ring3 切換到 ring0, 然后執(zhí)行系統(tǒng)函數(shù),創(chuàng)建線(xiàn)程,線(xiàn)程阻塞喚醒是重型操作,因?yàn)镃PU要切換運(yùn)行狀態(tài)。 

JVM 創(chuàng)建線(xiàn)程是 CPU 的流程:

  • 第一步:CPU 從 ring3 切換 ring0 創(chuàng)建線(xiàn)程

  • 第二步: 創(chuàng)建完畢,CPU從 ring0 切回 ring3

  • 第三步: 線(xiàn)程執(zhí)行JVM程序

  • 第四步: 線(xiàn)程執(zhí)行完畢,銷(xiāo)毀切回 ring0

  • 第五步: 線(xiàn)程銷(xiāo)毀,切回 ring3

2.操作系統(tǒng)內(nèi)存管理

為了使程序運(yùn)行安全隔離與穩(wěn)定,操作系統(tǒng)有用戶(hù)空間內(nèi)核空間兩個(gè)概念。以 32位操作系統(tǒng)4G大小的內(nèi)存空間為例:

Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些

Linux 為內(nèi)核代碼和數(shù)據(jù)結(jié)構(gòu)預(yù)留了幾個(gè)頁(yè)框,這些頁(yè)永遠(yuǎn)不會(huì)被轉(zhuǎn)出到磁盤(pán)上(4GB內(nèi)存空間,用戶(hù)程序可使用3GB)。如圖綠色部分的線(xiàn)性地址可由用戶(hù)代碼和內(nèi)核代碼進(jìn)行引用(即用戶(hù)空間)。黃色部分的線(xiàn)性地址只能由內(nèi)核代碼進(jìn)行訪(fǎng)問(wèn)(即內(nèi)核空間)。

進(jìn)程與線(xiàn)程只能運(yùn)行在用戶(hù)方式(usermode) 或 內(nèi)核方式(kernelmode) 下。用戶(hù)程序運(yùn)行在用戶(hù)方式下,而系統(tǒng)調(diào)用運(yùn)行在內(nèi)核方式下。

用戶(hù)方式下使用一般的堆棧(用戶(hù)空間的堆棧),內(nèi)核方式下使用固定大小的堆棧(內(nèi)核空間的堆棧,一般為一個(gè)內(nèi)存頁(yè)的大小),即每個(gè)進(jìn)程與線(xiàn)程其實(shí)有兩個(gè)堆棧,分別運(yùn)行與用戶(hù)態(tài)內(nèi)核態(tài)。

CPU調(diào)度的基本單位線(xiàn)程,也劃分為:

  • 內(nèi)核線(xiàn)程模型(KLT): Java使用,內(nèi)核保存線(xiàn)程的狀態(tài)和上下文信息,線(xiàn)程阻塞不會(huì)引起進(jìn)程阻塞。在多處理器系統(tǒng)上,多線(xiàn)程在多處理器上并行運(yùn)行。線(xiàn)程的創(chuàng)建、調(diào)度和管理由內(nèi)核完成,效率比ULT要慢,比進(jìn)程操作快。

  • 用戶(hù)線(xiàn)程模型(ULT): 不依賴(lài)操作系統(tǒng)核心,應(yīng)用提供創(chuàng)建、同步、調(diào)度和管理線(xiàn)程的函數(shù)來(lái)控制用戶(hù)線(xiàn)程。不需要用戶(hù)態(tài)/內(nèi)核態(tài)切換,速度快。內(nèi)核對(duì)ULT無(wú)感知,線(xiàn)程阻塞則進(jìn)程(包括它的所有線(xiàn)程)阻塞

Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些

 線(xiàn)程都有兩個(gè)堆棧,一個(gè)在用戶(hù)空間,一個(gè)在內(nèi)核空間。阻塞、創(chuàng)建、殺死線(xiàn)程將拋棄用戶(hù)空間的堆棧,轉(zhuǎn)移到內(nèi)核空間,執(zhí)行完畢后再轉(zhuǎn)移到用戶(hù)空間。

3.進(jìn)程與線(xiàn)程

進(jìn)程: 操作系統(tǒng)資源分配的最小單位,例如:?jiǎn)?dòng)一個(gè) Java 程序,操作系統(tǒng)就會(huì)創(chuàng)建一個(gè)Java 進(jìn)程,進(jìn)程中可以包含多個(gè)線(xiàn)程。

線(xiàn)程: 操作系統(tǒng)調(diào)度CPU的最小單元,線(xiàn)程都擁有各自的計(jì)數(shù)器、堆棧和局部變量等屬性, 并且能夠訪(fǎng)問(wèn)共享的內(nèi)存變量。CPU 在這些線(xiàn)程上高速切換,讓使用者感覺(jué)到這些線(xiàn)程在同時(shí)執(zhí)行(并發(fā))。

線(xiàn)程上下切換: 保存上一個(gè)線(xiàn)程運(yùn)行的中間狀態(tài),執(zhí)行下一個(gè)線(xiàn)程

Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些

  • 串行: 時(shí)間上不可重疊,前一個(gè)任務(wù)沒(méi)完成,下一個(gè)任務(wù)只能等待

  • 并行: 時(shí)間上是重疊的,兩個(gè)任務(wù)在同一時(shí)刻互不干擾的同時(shí)執(zhí)行

  • 并發(fā): 運(yùn)行兩個(gè)任務(wù)彼此干擾,同一時(shí)間點(diǎn),只有一個(gè)任務(wù)執(zhí)行,交替執(zhí)行

以上就是“Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

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

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

AI