版權歸原作者所有,如有侵權,請聯系我們

[科普中國]-緩存一致性

科學百科
原創(chuàng)
科學百科為用戶提供權威科普內容,打造知識科普陣地
收藏

在計算機科學中,緩存一致性(英語:Cache coherence,或cache coherency),又譯為緩存連貫性、緩存同調,是指保留在高速緩存中的共享資源,保持數據一致性的機制。

緩存一致性問題的提出計算機在執(zhí)行程序時,每條指令都是在CPU中執(zhí)行的,而執(zhí)行指令過程中會涉及到數據的讀取和寫入。由于程序運行過程中的臨時數據是存放在主存(物理內存)當中的,這時就存在一個問題,由于CPU執(zhí)行速度很快,而從內存讀取數據和向內存寫入數據的過程跟CPU執(zhí)行指令的速度比起來要慢的多,因此如果任何時候對數據的操作都要通過和內存的交互來進行,會大大降低指令執(zhí)行的速度。因此在CPU里面就有了高速緩存(Cache)的概念。當程序在運行過程中,會將運算需要的數據從主存復制一份到CPU的高速緩存當中,那么CPU進行計算時就可以直接從它的高速緩存讀取數據和向其中寫入數據,當運算結束之后,再將高速緩存中的數據刷新到主存當中。1

這一過程在單線程運行是沒有問題的,但是在多線程中運行就會有問題了。在多核CPU中,每條線程可能運行于不同的CPU中,因此每個線程運行時有自己的高速緩存(對單核CPU來說,其實也會出現這種問題,只不過是以線程調度的形式來分別執(zhí)行的)。這時CPU緩存中的值可能和緩存中的值不一樣,這就是著名的緩存一致性問題2。

在一個系統(tǒng)中,當許多不同的設備共享一個共同存儲器資源,在高速緩存中的數據不一致,就會產生問題。這個問題在有數個CPU的多處理機系統(tǒng)中特別容易出現。

緩存一致性可以分為三個層級:

在進行每個寫入運算時都立刻采取措施保證數據一致性

每個獨立的運算,假如它造成數據值的改變,所有進程都可以看到一致的改變結果

在每次運算之后,不同的進程可能會看到不同的值(這也就是沒有一致性的行為)

緩存一致性的解決方案為了解決緩存不一致性問題,通常來說有以下2種解決方法:

1.通過在總線加LOCK#鎖的方式

2.通過緩存一致性協(xié)議

這2種方式都是硬件層面上提供的方式。

在早期的CPU當中,是通過在總線上加LOCK#鎖的形式來解決緩存不一致的問題。因為CPU和其他部件進行通信都是通過總線來進行的,如果對總線加LOCK#鎖的話,也就是說阻塞了其他CPU對其他部件訪問(如內存),從而使得只能有一個CPU能使用這個變量的內存。在總線上發(fā)出了LCOK#鎖的信號,那么只有等待這段代碼完全執(zhí)行完畢之后,其他CPU才能從其內存讀取變量,然后進行相應的操作。這樣就解決了緩存不一致的問題。3

但是由于在鎖住總線期間,其他CPU無法訪問內存,會導致效率低下。因此出現了第二種解決方案,通過緩存一致性協(xié)議4來解決緩存一致性問題。。最出名的就是Intel 的MESI協(xié)議,MESI協(xié)議保證了每個緩存中使用的共享變量的副本是一致的。它核心的思想是:當CPU寫數據時,如果發(fā)現操作的變量是共享變量,即在其他CPU中也存在該變量的副本,會發(fā)出信號通知其他CPU將該變量的緩存行置為無效狀態(tài),因此當其他CPU需要讀取這個變量時,發(fā)現自己緩存中緩存該變量的緩存行是無效的,那么它就會從內存重新讀取。

MESI協(xié)議單核Cache中每個Cache line有2個標志:dirty和valid標志,它們很好的描述了Cache和Memory(內存)之間的數據關系(數據是否有效,數據是否被修改),而在多核處理器中,多個核會共享一些數據,MESI協(xié)議就包含了描述共享的狀態(tài)。

在MESI協(xié)議中,每個Cache line有4個狀態(tài),可用2個bit表示,它們分別是:

M(Modified):這行數據有效,數據被修改了,和內存中的數據不一致,數據只存在于本Cache中。

E(Exclusive):這行數據有效,數據和內存中的數據一致,數據只存在于本Cache中。

S(Shared):這行數據有效,數據和內存中的數據一致,數據存在于很多Cache中。

I(Invalid):這行數據無效。

在該協(xié)議的作用下,雖然各cache控制器隨時都在監(jiān)聽系統(tǒng)總線,但能監(jiān)聽到的只有讀未命中、寫未命中以及共享行寫命中三種情況。讀監(jiān)聽命中的有效行都要進入S態(tài)并發(fā)出監(jiān)聽命中指示,但M態(tài)行要搶先寫回主存;寫監(jiān)聽命中的有效行都要進入I態(tài),但收到RWITM時的M態(tài)行要搶先寫回主存。總之監(jiān)控邏輯并不復雜,增添的系統(tǒng)總線傳輸開銷也不大,但MESI協(xié)議卻有力地保證了主存塊臟拷貝在多cache中的一致性,并能及時寫回,保證cache主存存取的正確性。5

本詞條內容貢獻者為:

王慧維 - 副研究員 - 西南大學