1、緩存一致性
當高速緩存存在以后,每個CPU獲取/存儲數據直接操作高速緩存,而不是內存,這樣當多個線程運行在不同CPU中時。同一份內存數據就可能會緩存於多個CPU高速緩存中,如不進行限制,就會出現緩存一致性問題
CPU層面提出了兩種解決辦法:1. 總線鎖,2. 緩存鎖
2、總線鎖和緩存鎖
- 總線鎖:在多CPU下,當其中一個處理器要對共享內存進行操作的時候,在總線上發出一個LOCK信號,使得其他處理器無法訪問共享數據,開銷很大,如果我們能夠控制鎖的粒度就能減少開銷,從而引入了緩存鎖。
- 緩存鎖:只要保證多個CPU緩存的同一份數據是一致的就可以了,相比總線鎖,緩存鎖即降低了鎖的力度。核心機制是基於緩存一致性協議來實現的。
2.1、緩存一致性協議
為了達到數據訪問的一致,需要各個處理器在訪問 高速緩存 時遵循一些協議,在讀寫時根據協議來操作,常見的協議有MSI、MESI、MOSI。最常見的是MESI協議。
2.1.1 MESI協議
在MESI協議中,每個高速緩存的 緩存控制器 不僅知道自己的讀寫操作,而且也監聽其他告訴緩存的讀寫操作。共有四種狀態,分別是:
- M(Modify)表示共享數據只緩存在當前CPU緩存中,並且是被修改的狀態。此時表示當前CPU緩存數據與主內存中不一致,其他CPU緩存中如果緩存了當前數據應是無效狀態,因為該數據已被修改且並沒更新到主內存
- E(Exclusive)表示緩存的獨占狀態,數據只緩存在當前CPU緩存中,並且沒有被修改
- S(Shared)表示數據可能被多個CPU緩存,並且各個緩存中的數據和主內存中的數據一致
- I(Invalid)表示當前緩存已經失效