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