欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

認(rèn)識(shí)Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)

 更新時(shí)間:2022年07月29日 11:56:04   作者:Hz488  
這篇文章主要介紹了認(rèn)識(shí)Java底層操作系統(tǒng)與并發(fā)基礎(chǔ),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

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

image.png

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

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

image.png

  • 控制單元: 整個(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,所有物理核共享

image.png

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

image.png

寄存器是 CPU 內(nèi)部元件,讀寫(xiě)速度非???。 CPU 讀取數(shù)據(jù)只會(huì)從寄存器中去取,每個(gè) CPU 都有一個(gè)獨(dú)有的寄存器,其他 CPU 無(wú)法訪問(wèn)。采用寄存器,可以減少 CPU 訪問(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)存控制器占用總線帶寬,通知內(nèi)存加鎖,發(fā)起內(nèi)存讀請(qǐng)求,等待回應(yīng),回應(yīng)數(shù)據(jù)拷貝到L3 Cache。 注意:整個(gè)過(guò)程加鎖直至到CPU才會(huì)解開(kāi)

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

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

  • 時(shí)間局部性(Temporal Locality): 如果一個(gè)信息項(xiàng)正在被訪問(wèn),那么在近期它很可能還會(huì)被再次訪問(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 用戶態(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)建線程,線程阻塞喚醒是重型操作,因?yàn)镃PU要切換運(yùn)行狀態(tài)。 

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

  • 第一步:CPU 從 ring3 切換 ring0 創(chuàng)建線程
  • 第二步: 創(chuàng)建完畢,CPU從 ring0 切回 ring3
  • 第三步: 線程執(zhí)行JVM程序
  • 第四步: 線程執(zhí)行完畢,銷(xiāo)毀切回 ring0
  • 第五步: 線程銷(xiāo)毀,切回 ring3

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

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

image.png

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

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

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

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

  • 內(nèi)核線程模型(KLT): Java使用,內(nèi)核保存線程的狀態(tài)和上下文信息,線程阻塞不會(huì)引起進(jìn)程阻塞。在多處理器系統(tǒng)上,多線程在多處理器上并行運(yùn)行。線程的創(chuàng)建、調(diào)度和管理由內(nèi)核完成,效率比ULT要慢,比進(jìn)程操作快。
  • 用戶線程模型(ULT): 不依賴(lài)操作系統(tǒng)核心,應(yīng)用提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來(lái)控制用戶線程。不需要用戶態(tài)/內(nèi)核態(tài)切換,速度快。內(nèi)核對(duì)ULT無(wú)感知,線程阻塞則進(jìn)程(包括它的所有線程)阻塞

image.png

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

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

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

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

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

image.png

  • 串行: 時(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í)行

到此這篇關(guān)于認(rèn)識(shí)Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)的文章就介紹到這了,更多相關(guān)Java底層操作系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis自定義typeHandler的完整實(shí)例

    MyBatis自定義typeHandler的完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于MyBatis自定義typeHandler的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MyBatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java8?函數(shù)式編程stream流使用詳解

    Java8?函數(shù)式編程stream流使用詳解

    這篇文章主要介紹了Java8?函數(shù)式編程stream流使用詳解的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究

    JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究

    Servlet指在服務(wù)器端執(zhí)行的一段Java代碼,可以接收用戶的請(qǐng)求和返回給用戶響應(yīng)結(jié)果,下面這篇文章主要給大家介紹了關(guān)于JavaWeb.servlet生命周期的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Java中Scanner用法實(shí)例解析

    Java中Scanner用法實(shí)例解析

    Scanner?指的是java.util包下的Scanner類(lèi),可以接收控制臺(tái)輸入的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java中Scanner用法實(shí)例的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 使用Java實(shí)現(xiàn)一個(gè)能保留計(jì)算過(guò)程的計(jì)算器

    使用Java實(shí)現(xiàn)一個(gè)能保留計(jì)算過(guò)程的計(jì)算器

    計(jì)算器是我們?nèi)粘I钪谐S玫墓ぞ咧?它能夠進(jìn)行基本的數(shù)學(xué)運(yùn)算,如加法、減法、乘法和除法,而在設(shè)計(jì)一個(gè)計(jì)算器時(shí),我們可以通過(guò)使用Java編程語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的控制臺(tái)計(jì)算器,并且讓它能夠保留計(jì)算過(guò)程,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-11-11
  • JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理

    JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理

    這篇文章主要介紹了JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理 的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • Java SpringBoot開(kāi)發(fā)小技巧詳解

    Java SpringBoot開(kāi)發(fā)小技巧詳解

    這篇文章主要介紹了淺談SpringBoot項(xiàng)目如何讓前端開(kāi)發(fā)提高效率(小技巧),主要介紹了Swagger和Nginx提高效率的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java CAS機(jī)制的一些理解

    Java CAS機(jī)制的一些理解

    這篇文章主要介紹了Java CAS機(jī)制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-05-05
  • Java?map和bean互轉(zhuǎn)常用的方法總結(jié)

    Java?map和bean互轉(zhuǎn)常用的方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java中map和bean互轉(zhuǎn)常用方法的相關(guān)資料,平時(shí)日常Java開(kāi)發(fā),經(jīng)常會(huì)涉及到Java?Bean和Map之間的類(lèi)型轉(zhuǎn)換,需要的朋友可以參考下
    2023-09-09
  • java郵件發(fā)送的實(shí)現(xiàn)

    java郵件發(fā)送的實(shí)現(xiàn)

    本篇是用于java來(lái)實(shí)現(xiàn)郵件的發(fā)送的實(shí)例代碼,基于smtp服務(wù),有需要的可以參考一下。
    2016-10-10

最新評(píng)論