標籤:cpu cache memroy type mesi
看了上一篇文章,你可能很想知道,為什麼程式的運行結果會是這樣,現在,就讓我們來走進 CPU 的世界。
在 SMP(對稱式多處理器)時代,多個 CPU 一起工作,使運算能力進一步提升,那麼CPU 是如何協調好記憶體訪問的呢?
+--------------+ +--------------+ | CPU0 | | CPU1 | +--------------+ +--------------+ ^ | ^ | | | | | | V | V | +--------+ | +--------+ |<--> | Store | |<--> | Store | | | Buffer | | | Buffer | | +--------+ | +--------+ | | | | | V | V +--------------+ +--------------+ | Cache | | Cache | +--------------+ +--------------+ | | | | +------------+ +------------+ | Invalidate | | Invalidate | | Queue | | Queue | +------------+ +------------+ | Interconnect | +----------------------------------+ | +-----------------------+ | Memory | +-----------------------+
是現代 CPU 普遍採用的架構,由於 CPU 的運算能力的增長速度比記憶體訪問速度快很多,使得記憶體的存取成為指令執行過程中相對較慢的過程,所以在 CPU 運算單元和
主存之間還會存在多級的緩衝,通常稱為 L1, L2, L3,對他們的訪問速度依次遞減,中只顯示了一級緩衝的存在。這樣,當 CPU 訪問記憶體時,就會先在自己的 Cache 中查
找,看是否這段記憶體已經被緩衝起來,如果已在緩衝中,那麼,直接存取緩衝即可完成功能。有了緩衝的存在,CPU 的運算速度得到了極大的提高。由於緩衝比較昂貴,所以一般都較小,在我的奔騰 E5800 的電腦上,一級緩衝一共才 128KBytes.
緩衝是由緩衝行組成,通常稱之為 Cache line,現代 Intel CPU 中,一般都為 64B,通常,緩衝都是由多路關聯組成,我的 CPU 就是 4-way 關聯,這裡不想深入講解多路關
聯緩衝的工作原理,有興趣的可以自行查閱。
當緩衝中沒有需要的資料時,叫做 cache miss, 這時一般會從記憶體中載入,cache 載入都是以 cache line 為單位,並且以 cache line 對齊,也就是在 cache line 對齊的
地址上載入 cache line 大小的內容進入緩衝,這裡一般為 64 個位元組,就也就是把常用資料放在一個 cache line 對齊的記憶體中,這樣的資料結構會使得運算效率提高的原因。
當多個 CPU 都需要訪問相同記憶體時,那麼同一段記憶體的內容將會出現在多個 CPU 的cache 之中,這帶來的一個問題就是,如何維護好它們之間的統一性就成了問題,比如,當同一塊地址被兩個 cache 同時緩衝的時候,其中一個要改寫,那麼必須要存在一種手段去通知另外的 cache 即時更新,以免另一個 CPU 需要取資料時能得到最新的資料。
緩衝既然帶來了這些問題,那麼可不可以指令某些記憶體被訪問時要不要被緩衝呢,或者更準確地講,當訪問一塊記憶體時如何控制緩衝的形為呢?答案是可以的,我們可以指定記憶體的類型。通過 MTRRs 寄存器可以指定物理位址範圍的記憶體類型,一般記憶體有這些常用類型:
1. UC (Uncacheable), 表示這段記憶體不能被緩衝。
2. WT (Write Through), 表示寫入時,cache 和記憶體都是更新。
3. WB (Write Back), 表示只更新 cache, 合適時機再寫回到記憶體中。
4. WC (Write combining) 這種記憶體不會被 cache, 對於寫操作可能會被延遲寫入。
但是往往,為了取得比較高的效率,普通記憶體的使用一般會選擇 WB 類型,也就是記憶體會被 cache ,此時就需要一種手段來保證各個 cache 之間的一致性了,專業一點來講就是 Cache-coherence 。
那麼如何知道自己 cache 中的 cache line 在其它 CPU 的 cache 中存在呢,如何記錄自己的 cache line 被自己修改過,需要回寫呢,顯然要有一些狀態標記來記錄這些
東西,這就是 MESI 協議。
在MESI協議中,每個Cache line有4個狀態,可用2個bit表示,它們分別是:
1. M(Modified)
這行資料有效,資料被修改了,和記憶體中的資料不一致,資料只存在於本Cache中。
2. E(Exclusive)
這行資料有效,資料和記憶體中的資料一致,資料只存在於本Cache中。
3. S(Shared)
這行資料有效,資料和記憶體中的資料一致,資料可能存在於很多Cache中。
4. I(Invalid)
這行資料無效。
真相正在一步一步解開...
走進 CPU 的 Cache