Java需要掌握的底层知识_java程序员需要知道的底层知识(一)
首先給自己一個(gè)介紹,本人是一個(gè)蠢笨蠢笨的女程序員,由于有一天突然覺悟了,想在學(xué)習(xí)的過程中寫一些筆記,以前一直不敢開始這個(gè)事情,因?yàn)槲液ε聦戝e(cuò)了,誤導(dǎo)了別人,現(xiàn)在還是害怕,如果真的誤導(dǎo)了同行,你們也輕點(diǎn)噴我 哈哈哈
接下來進(jìn)入正題,今天來記錄一下我自己學(xué)到的東西,Java相關(guān)的硬件知識(shí),說到這個(gè)我們先談?wù)動(dòng)?jì)算機(jī)的最重要的組成部分,跟我們寫程序聯(lián)系比較緊密的部分:
先來看看計(jì)算機(jī)的組成,如下圖:
一、cpu(計(jì)算機(jī)的重要組成部分)
cpu是計(jì)算機(jī)的核心組成部分,功能主要是解釋計(jì)算機(jī)指令以及處理計(jì)算機(jī)軟件中的數(shù)據(jù),cpu中有一個(gè)重要的部件,就是時(shí)鐘發(fā)生器,他就像人的心臟,推動(dòng)著cpu進(jìn)行一步一步的計(jì)算,比如我計(jì)算3+2需要多少步驟,通過時(shí)鐘發(fā)生器不斷的通電斷電給cpu信號(hào),推動(dòng)cpu進(jìn)行計(jì)算(比較粗略的理解)
PC:Program Counter 程序計(jì)數(shù)器(每個(gè)線程私有) 記錄當(dāng)前指令的地址
Registers: 寄存器 暫時(shí)存儲(chǔ)cpu計(jì)算需要用到的數(shù)據(jù)
ALU:Arithmetic & Login Unit 邏輯運(yùn)算單元
ALU邏輯運(yùn)算單元,當(dāng)一個(gè)線程獲得執(zhí)行時(shí)間片開始執(zhí)行,需要進(jìn)行運(yùn)算的時(shí)候,那么ALU從寄存器中取出某個(gè)線程的數(shù)據(jù)來進(jìn)行運(yùn)算,
此處有一個(gè)知識(shí)點(diǎn),就是現(xiàn)在說的超線程,比如兩核四線程、四核八線程,是怎么實(shí)現(xiàn)的,比如原來的單核單線程,就是一個(gè)cpu的一個(gè)核里面只有一組PC(程序計(jì)數(shù)器)和Registers(寄存器),當(dāng)一個(gè)線程獲得執(zhí)行時(shí)間片時(shí),需要將前一個(gè)線程的數(shù)據(jù)先保存起來,再將自己的數(shù)據(jù)放入PC和Registers,而超線程的實(shí)現(xiàn),就是cpu的一個(gè)核里面有兩組PC和Registers,當(dāng)其中的一個(gè)線程獲得執(zhí)行的時(shí)間片之后,ALU可以直接去該線程對(duì)應(yīng)的PC和Registers取得數(shù)據(jù),節(jié)省線程切換的消耗,達(dá)到提升性能的目的,如下圖:
CU:Control Unit 控制單元(本人還沒理解透徹)
MMU:Memory Management Unit 內(nèi)存管理單元(本人還沒理解透徹)
cache:緩存
cpu和內(nèi)存的速度比大概是100:1,緩存就是為了解決cpu和內(nèi)存的速度差異,緩存分為L1、L2、L3,cpu的每一個(gè)核都擁有獨(dú)立的L1、L2這兩級(jí)緩存,L3是所有核共享的,如下圖:
下面我們?cè)俳榻B緩存行的概念,緩存行是cpu緩存系統(tǒng)中的基本單位,當(dāng)cpu從內(nèi)存當(dāng)中讀取數(shù)據(jù)的時(shí)候,并不是你需要某個(gè)字節(jié)就只讀取某個(gè)字節(jié),而是將你需要的字節(jié)所在的內(nèi)存塊讀取到緩存行,因?yàn)楦鶕?jù)一定的預(yù)測,可能需要的數(shù)據(jù)也不只是這一個(gè)字節(jié),也許周圍的數(shù)據(jù)你也是需要的,這樣的讀取也可以提高效率
到這里,再記錄一個(gè)與緩存行有關(guān)的知識(shí),MESI協(xié)議,緩存一致性協(xié)議是指一個(gè)緩存行,在不同的cpu中被修改之后,要保證數(shù)據(jù)一致,每個(gè)緩存行都有額外的兩個(gè)位來存儲(chǔ)緩存行的狀態(tài)(modified、exclusive、shared、invalid),當(dāng)處于同一個(gè)緩存行的數(shù)據(jù),在A(cpu的內(nèi)核)處被修改,那么B處的緩存行將變成失效狀態(tài),當(dāng)B需要修改同一個(gè)緩存行的數(shù)據(jù)時(shí),需要重新從內(nèi)存中讀取數(shù)據(jù)再進(jìn)行修改,緩存一致性協(xié)議有MSI,MESI(Intel)、synapse、Firely、Dragon等,不同品牌的cpu使用不同的緩存一致性協(xié)議
此處有一個(gè)問題叫偽共享,我們以Intel cpu舉例,當(dāng)cpu的兩個(gè)核分別修改了同一個(gè)緩存行中的獨(dú)立變量時(shí),實(shí)際上兩個(gè)變量是互不影響的,但是由于他們?cè)谝粋€(gè)緩存行中,當(dāng)A修改了a,B中的緩存行就會(huì)變成失效狀態(tài),這個(gè)時(shí)候如果B修改b,就必須要先提交A中的緩存行,然后B再去內(nèi)存當(dāng)中讀取這個(gè)緩存行進(jìn)行修改,此操作應(yīng)該是一個(gè)并行操作,但是由于緩存一致性,卻變成了串行,反而降低了效率
解決辦法是,緩存行對(duì)齊:對(duì)于一些特別敏感的數(shù)字,會(huì)存在線程高競爭的訪問,可以使用緩存行對(duì)齊的編程方式
JDK7中,很多采用long padding提高效率
JDK8,加入了@Contended注解
需要加上:JVM -XX:-RestrictContended
二、內(nèi)存(計(jì)算機(jī)的重要組成部分)(下次研究哈哈哈哈)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Java需要掌握的底层知识_java程序员需要知道的底层知识(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《GTA 三部曲最终版》游戏登陆 Epi
- 下一篇: java美元兑换,(Java实现) 美元