您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)知識(shí)有哪些的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
核心部分: CPU、內(nèi)存
控制單元: 整個(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 和 寄存器組
現(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,所有物理核共享
此機(jī)器的三級(jí)緩存架構(gòu)如下圖:L1 Cache又分為兩種,指令存儲(chǔ)單元(存指令),和邏輯存儲(chǔ)單元(存邏輯)。理論上一臺(tái)機(jī)器可以有多個(gè) CPU,由插槽決定,一個(gè) CPU 又有多核,一個(gè)核又可以由多個(gè)邏輯處理器。
寄存器是 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)去。
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
為了使程序運(yùn)行安全隔離與穩(wěn)定,操作系統(tǒng)有用戶(hù)空間
與內(nèi)核空間
兩個(gè)概念。以 32位操作系統(tǒng)4G大小的內(nèi)存空間為例:
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)程)阻塞
線(xiàn)程都有兩個(gè)堆棧,一個(gè)在用戶(hù)空間,一個(gè)在內(nèi)核空間。阻塞、創(chuàng)建、殺死線(xiàn)程將拋棄用戶(hù)空間的堆棧,轉(zhuǎn)移到內(nèi)核空間,執(zhí)行完畢后再轉(zhuǎn)移到用戶(hù)空間。
進(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)程
串行: 時(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è)資訊頻道。
免責(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)容。