開發需要知道的CPU底層知識學習記錄

2021-10-08 20:43:53 字數 2923 閱讀 4115

cpu的作用:

取指令,取資料,做運算,然後將運算結果寫入記憶體,執行緒是cpu執行的最小單元

cpu的主要組成:

一台計算機cpu訪問資料共享範圍:

說明

cpu獲取資料的時間週期對比:

下圖資料**網路

cpu執行單執行緒:

當前執行緒執行到一半的時候,如果要讓出cpu時間片,會將當前執行執行緒對應的資料和當前執行狀態(指令執行行數、指令執行位置、指令執行資料等)儲存到記憶體中,然後將cpu時間片讓給下乙個要執行的執行緒。當原來執行到一半的執行緒再次搶到cpu時間片的時候,會根據原來執行了一半的執行緒儲存的執行緒執行狀態恢復資料到cpu(恢復現場),接著原來指令執行位置繼續向下執行。

超執行緒:

cpu運算最快的單元是alu

單核雙線程、四核八執行緒 ,雙核四執行緒 一類

為了提公升alu的計算週期利用率,乙個alu 可以對應 兩組 暫存器+指令計數器,這樣乙個核就可以裝兩個執行緒,alu切換計算兩組暫存器+指令計數器中的指令,這樣即提公升了計算週期,也可以很大程度省區切換執行緒恢復資料的週期。

cpu 記憶體:

cpu中記憶體可見:通過快取一致性協議同步資料

cpu記憶體行(cache line):cpu從記憶體中讀取資料的方式 一次讀一堆, 一塊一塊的讀,每一塊叫快取行(cache line) 一般:一塊=64位元組

cpu在計算的時候會根據指令先從l1中找,找不到再從l2中,知道記憶體中找,從記憶體中找到後會將資料相關的一整塊(乙個cache line)依次讀到l3、l2、l1,然後再做計算

同一cpu中,多核之間可能同時快取同一快取塊的資料,如果核1中修改的資料有volatile 關鍵字修飾,對核2中線程必須要可見,多核之間為了確保不同核中 l1 和 l2 中快取的cache line 中的資料一致性,採用的是快取一致性協議。有些無法快取的資料或者跨多個快取

快取一致性協議:

快取一致性協議有很多種,mesi只是其中一種,取決於不同的cpu

mesi 是指快取行 cache line 的四種狀態

modified 被修改了

exclusive 獨享

shared 共享 大家都去讀 並不修改

invalid 失效

說明:如果乙個快取行 cache line 中快取了一堆資料 有x ,y

當核1 中 x 修改後 核1中的 cache line 的狀態變為 modified,並寫入記憶體, 這時會通過 兩核之間的聯絡通知給核2,告訴核2 該cacheline 已經被修改了,之後 核2中的 cache line 的狀態 變成 invalid ,即表示該快取行已失效,應重新從記憶體中讀取

結論:兩個執行緒在同時修改兩個資料時,如果這兩個資料在同乙個快取塊中,效率要低於兩個資料在不同快取塊的情況,因為同一快取中的資料在被更新的時候會通過快取鎖等待相互更新完畢後再同步資料,而不同快取中不需要通知其它快取行資料已經過期,所以速度快。

證明:

/**

* @功能說明: 驗證多執行緒在修改統一快取行和修改不同快取行效率問題

* 結論:

* 兩個執行緒在同時修改兩個資料時,如果這兩個資料在同乙個快取塊中,效率要低於兩個資料在不同快取塊的情況,

* 因為同一快取中的資料在被更新的時候會通過快取鎖等待相互更新完畢後再同步資料,

* 而不同快取中不需要通知其它快取行資料已經過期,所以速度快。

*/public

class

test_cachelinepadding

// 繼承乙個 56 位元組的 padding + t 中的 x 組成64個位元組,

// 構建要修改的資料分別在不同快取行的情況

private

static

class

textends

padding

public

static t[

] arr =

newt[2

];static

public

static

void

test2()

throws exception})

; thread t2 =

newthread((

)->})

;final

long start = system.

nanotime()

; t1.

start()

; t2.

start()

; t1.

join()

; t2.

join()

;final

long end = system.

nanotime()

; system.out.

println

((end-start)

/1000000);

}public

static

void

main

(string[

] args)

throws exception

}

cpu 亂序執行

目的是為了提公升cpu執行效率

說明:有兩條指令 a b,先執行a指令,a指令可能由於從記憶體中讀取資料,執行比較慢,這時候cpu是空閒的,為了提公升cup的效率,會檢視b指令是不是和a指令有依賴關係 如 b = a +1,如果沒有依賴關係 會先去執行b指令

學資料分析需要知道的知識(二)

那麼我們怎麼找出正確的資料指標呢?這就需要重視幾個細節,那就是定性指標與量化指標。那麼怎麼區分定性指標和量化指標呢?定量資料指的是那些我們跟蹤和衡量的數字。定性資料指的是難量化的資料。定量資料回答的是 什麼 和 多少 這樣的問題,定性資料回答的就是 為什麼 定量資料排斥主觀因素 定性資料吸納主觀因素...

學資料分析需要知道的知識(二)

那麼我們怎麼找出正確的資料指標呢?這就需要重視幾個細節,那就是定性指標與量化指標。那麼怎麼區分定性指標和量化指標呢?定量資料指的是那些我們跟蹤和衡量的數字。定性資料指的是難量化的資料。定量資料回答的是 什麼 和 多少 這樣的問題,定性資料回答的就是 為什麼 定量資料排斥主觀因素 定性資料吸納主觀因素...

你需要知道的編碼 亂碼 知識

中文在風靡全球的路上如果一定有阻礙,那就是亂碼啊。引無數大神盡折腰的編碼轉換問題,這篇文章就記錄下這個問題。大家知道,計算機是只認識二進位制的,如果乙個字元變成了我們肉眼可見的亂碼時,一定是因為我們給了計算機錯誤的編碼格式導致的。文章開始,我們先說說程式設計時,我們的儲存 的檔案的編碼,以vs200...