Appendix
Last updated
Last updated
下表是關於文章中的一些術語的整理:
Term
English
Description
共享變數
Shared Variable
在多個執行緒之間能夠被共享的變數. 其包含了所有的實例變數, 靜態變數和陣列元素. 它們都被存放在heap記憶體中, volatile只會作用於共享變數.
記憶體屏障
Memory Barriers
是一組處理器指令, 用於實作對記憶體操作的順序限制.
快取行(塊)
Cache Line/Cache Block
快取中可以分配的最小儲存單位. 處理器填寫cache block時會加載整個cache line, 需要使用多個主記憶體的讀取週期.
原子操作
Atomic Operation
不可中斷的一個或一系列操作.
快取行(塊)填充
Cache Line/Cache Block Fill
當處理器識別到從記憶體中讀取的運算元是可以被快取的, 處理器讀取整個cache block到適當的快取(L1, L2, L3的或所有).
快取命中
Cache Hit
若進行高速cache block填充操作的記憶體位置仍然是下次處理器存取的地址時, 處理器從快取中讀取運算元, 而不是從記憶體.
寫入命中
Write Hit
當處理器將運算元寫回一個記憶體快取區域時, 其首先會檢查此快取的記憶體地址是否在cache block中, 若存在一個有效的cache block, 則處理器將這個運算元寫回至快取, 而不是寫回記憶體.
寫缺失
Write Misses the Cache
一個有效的cache block被寫至不存在的記憶體區域.
CAS
Compare and Swap
比較並且設值. 用於硬體層面上提供原子性操作. CAS操作基本上需要輸入兩個數值, 一個舊值(期望操作之前的值), 一個新值, 在操作期間先比較舊值是否發生變化, 若沒有, 才交換成新值, 反之則不交換. 在Intel處理器中, CAS通過cmpxchg指令實作.
執行緒安全
Thread Safe
當多個執行緒存取同一個物件時, 若不用考慮這些執行緒在運作時環境下的調度與交替執行, 也無需額外的同步, 或著在呼叫方進行任何其它的協調操作, 這個物件的行為都可以獲得正確的結果, 那這個物件就是執行緒安全的. 這其實隱喻了一件事: 程式本身封裝了所有必要的正確性保障手段(如互斥同步等).
自旋
Spin (spin-waiting)
所謂的自旋, 就是讓執行緒執行一個busy loop, 這樣這個執行緒就會透過自旋來等待某個其想要獲取的鎖, 而當前持有鎖的執行緒也不用放棄CPU的執行時間. 自旋本身雖然避免了執行緒切換的開銷, 但其是要佔用處理器時間的(有執行緒自旋的那個處理器).
鎖的粗化
Lock Coarsening
若JVM探測到有一串零碎的操作都對同一個物件上鎖, 就可能把上鎖同步的範圍擴展(粗化, coarsening)到整個操作序列的外部. 常見的情境如String物件的連續append(by StringBuilder).
CPU管線
CPU Pipeline
CPU pipeline的運作方式就像工廠裡的裝配流水線, 在CPU中由多個不同功能的電路單元組成一條指令處理管線, 然後將一條x86指令分成多個步驟後再由這些電路單元分別執行, 如此即可實現在一個CPU clock cycle內完成一條指令, 藉此提高CPU的運算速度. 換個角度想, 這有點像是用面積在換效能的感覺, 即邏輯電路擺多一點, 就有可能同時完成由多個指令組合而成的複雜指令.
記憶體順序衝突
Memory Order Violation
這一般是指由false-sharing所引起的, 所謂的false-sharing是指多個CPU(或是想成執行緒)同時修改一個cache line的不同部分而引起其中一個CPU(執行緒)的操作無效, 當出現這種情況時, CPU必須清空pipeline.