首先給本身一個介紹,本人是一個蠢笨蠢笨的女程序員,因爲有一天忽然覺悟了,想在學習的過程當中寫一些筆記,之前一直不敢開始這個事情,由於我懼怕寫錯了,誤導了別人,如今仍是懼怕,若是真的誤導了同行,大家也輕點噴我 哈哈哈 接下來進入正題,今天來記錄一下我本身學到的東西,Java相關的硬件知識,說到這個咱們先談談計算機的最重要的組成部分,跟咱們寫程序聯繫比較緊密的部分: 先來看看計算機的組成,以下圖:
1、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和內存的速度差別,緩存分爲L一、L二、L3,cpu的每個核都擁有獨立的L一、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性能
2、內存(計算機的重要組成部分)(下次研究哈哈哈哈)學習