1、多執行緒同步——CPU、core核、執行緒、記憶體

夕西行發表於2024-07-14

CPU 的執行原理

控制單元在時序脈衝的作用下,將指令計數器裡所指向的指令地址(這個地址是在記憶體裡的)送到地址匯流排上去,然後 CPU 將這個地址裡的指令讀到指令暫存器進行譯碼。對於執行指令過程中所需要用到的資料,會將資料地址也送到地址匯流排,然後 CPU 把資料讀到 CPU 的內部儲存單元(就是內部暫存器)暫存起來,最後命令運算單元對資料進行處理加工。週而復始,一直這樣執行下去。

CPU的快取

CPU快取通常分成了三個級別:L1L2L3。級別越小越接近 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部落格

相關文章