1. 引言
原子(atom)本意是“不能被進一步分割的最小粒子”,而原子操作(atomic operation)意為"不可被中斷的一個或一系列操作" 。在多處理器上實現原子操作就變得有點複雜。本文讓我們一起來聊一聊在Intel處理器和Java裡是如何?原子操作的。
2. 術語定義
| 術語 |
英文 |
解釋 |
| 緩衝行 |
Cache line |
緩衝的最小操作單位 |
| 比較並交換 |
Compare and Swap |
CAS操作需要輸入兩個數值,一箇舊值(期望操作前的值)和一個新值,在操作期間先比較下舊值有沒有發生變化,如果沒有發生變化,才交換成新值,發生了變化則不交換。 |
| CPU流水線 |
CPU pipeline |
CPU流水線的工作方式就象工業生產上的裝配流水線,在CPU中由5~6個不同功能的電路單元組成一條指令處理流水線,然後將一條X86指令分成5~6步後再由這些電路單元分別執行,這樣就能實現在一個CPU刻度完成一條指令,因此提高CPU的運算速度。 |
| 記憶體順序衝突 |
Memory order violation |
記憶體順序衝突一般是由假共用引起,假共用是指多個CPU同時修改同一個緩衝行的不同部分而引起其中一個CPU的操作無效,當出現這個記憶體順序衝突時,CPU必須清空流水線。 |
3. 處理器如何?原子操作
32位IA-32處理器使用基於對緩衝加鎖或匯流排加鎖的方式來實現多處理器之間的原子操作。
3.1 處理器自動保證基本記憶體操作的原子性
首先處理器會自動保證基本的記憶體操作的原子性。處理器保證從系統記憶體當中讀取或者寫入一個位元組是原子的,意思是當一個處理器讀取一個位元組時,其他處理器不能訪問這個位元組的記憶體位址。奔騰6和最新的處理器能自動保證單一處理器對同一個緩衝行裡進行16/32/64位的操作是原子的,但是複雜的記憶體操作處理器不能自動保證其原子性,比如跨匯流排寬度,跨多個緩衝行,跨頁表的訪問。但是處理器提供匯流排鎖定和緩衝鎖定兩個機制來保證複雜記憶體操作的原子性。
3.2 使用匯流排鎖保證原子性
第一個機制是通過匯流排鎖保證原子性。如果多個處理器同時對共用變數進行讀改寫(i++就是經典的讀改寫操作)操作,那麼共用變數就會被多個處理器同時進行操作,這樣讀改寫操作就不是原子的,操作完之後共用變數的值會和期望的不一致,舉個例子:如果i=1,我們進行兩次i++操作,我們期望的結果是3,但是有可能結果是2。如