CPU 的執行原理
控制單元在時序脈衝的作用下,將指令計數器裡所指向的指令地址(這個地址是在記憶體裡的)送到地址匯流排上去,然後 CPU 將這個地址裡的指令讀到指令暫存器進行譯碼。對於執行指令過程中所需要用到的資料,會將資料地址也送到地址匯流排,然後 CPU 把資料讀到 CPU 的內部儲存單元(就是內部暫存器)暫存起來,最後命令運算單元對資料進行處理加工。週而復始,一直這樣執行下去。
CPU的快取
CPU快取通常分成了三個級別:L1
,L2
,L3
。級別越小越接近 CPU,所以速度也更快,同時也代表著容量越小。
L1 是最接近 CPU 的, 它容量最小(例如:32K
),速度最快。每個核上都有一個 L1 快取,每個核上其實有兩個 L1 快取, 一個用於存資料的 L1 d-Cache(Data Cache),一個用於存指令的 L1 i-Cache(Instruction Cache)。
L2 快取 更大一些(例如:256K
),速度要慢一些, 一般情況下每個核上都有一個獨立的 L2 快取。
L3 快取是三級快取中最大的一級(例如:3MB),同時也是最慢的一級, 在同一個 CPU 插槽之間的核共享一個 L3 快取。
讀取資料過程。就像資料庫快取一樣,首先在最快的快取中找資料,如果快取沒有命中(Cache miss) 則往下一級找, 直到三級快取都找不到時,向記憶體要資料。一次次地未命中,代表取資料消耗的時間越長。
計算過程。程式以及資料被載入到主記憶體;指令和資料被載入到 CPU 的高速緩;CPU 執行指令,把結果寫到快取記憶體;快取記憶體中的資料寫回主記憶體。
【參考】
程序、執行緒與多核、多CPU之間的關係 (qq.com)
Core核
一個核心只能同時執行一個執行緒
執行緒切換
- cpu給執行緒分配時間片(也就是分配給執行緒的時間),執行完時間片後會切換都另一個執行緒。
- 切換之前會儲存執行緒的狀態,下次時間片再給這個執行緒時才能知道當前狀態。
- 從儲存執行緒A的狀態再到切換到執行緒B時,重新載入執行緒B的狀態的這個過程就叫上下文切換。
- 而上下切換時會消耗大量的cpu時間。
【參考】
認識cpu、核與執行緒 - jiajun_geek - 部落格園 (cnblogs.com)
關於執行緒上下文切換,你知道多少? (qq.com) 有協程內容
重排序與記憶體可見性
CPU中每個核在執行執行緒時,都會建立一個本地快取來儲存主記憶體中的資料。在修改後,再非同步寫會給主記憶體。多個執行緒間對於變數的互動,是透過主記憶體來進行的。那麼這個過程中,就存在一個多個執行緒間本地快取同步的問題。比如說,現在對於一個主記憶體中的變數x=3,執行緒A將該值修改為x=4,但是,線上程A將資料同步到主記憶體前,執行緒B中就讀取了資料。那麼執行緒B中就講講本該x=4的值讀成了x=3,造成了執行緒間同步的錯誤。
【參考】
記憶體一致性,指令重排序,記憶體屏障,volatile解析_volatile記憶體屏障證明-CSDN部落格