緩存一致性協議


緩存一致性協議

操作系統的CPU和內存並不是直接交互操作的。我們的CPU有一級緩存,CPU直接操作一級緩存,由一級緩存和內存進行交互。
當然,有的CPU有二級緩存,甚至三級緩存等。實際上,大概二十年前,一級緩存是直接和內存交互的,現在,一般是二級緩存和內存直接通訊。

每個CPU都有一級緩存,但是,我們卻無法保證每個CPU的一級緩存數據都是一樣的。
所以同一個程序,CPU進行切換的時候,切換前和切換后的數據可能會有不一致的情況。那么這個就是一個很大的問題了。
如何保證各個CPU緩存中的數據是一致的。就是CPU的緩存一致性問題。

一種處理一致性問題的辦法是使用Bus Locking(總線鎖)。當一個CPU對其緩存中的數據進行操作的時候,往總線中發送一個Lock信號。
這個時候,所有CPU收到這個信號之后就不操作自己緩存中的對應數據了,當操作結束,釋放鎖以后,所有的CPU就去內存中獲取最新數據更新。

但是用鎖的方式總是避不開性能問題。總線鎖總是會導致CPU的性能下降。所以出現另外一種維護CPU緩存一致性的方式,MESI。

MESI是保持一致性的協議。它的方法是在CPU緩存中保存一個標記位,這個標記位有四種狀態:

  • M: Modify,修改緩存,當前CPU的緩存已經被修改了,即與內存中數據已經不一致了
  • E: Exclusive,獨占緩存,當前CPU的緩存和內存中數據保持一致,而且其他處理器並沒有可使用的緩存數據
  • S: Share,共享緩存,和內存保持一致的一份拷貝,多組緩存可以同時擁有針對同一內存地址的共享緩存段
  • I: Invalid,實效緩存,這個說明CPU中的緩存已經不能使用了

CPU的讀取遵循下面幾點:

  • 如果緩存狀態是I,那么就從內存中讀取,否則就從緩存中直接讀取。
  • 如果緩存處於M或E的CPU讀取到其他CPU有讀操作,就把自己的緩存寫入到內存中,並將自己的狀態設置為S。
  • 只有緩存狀態是M或E的時候,CPU才可以修改緩存中的數據,修改后,緩存狀態變為M。

這樣,每個CPU都遵循上面的方式則CPU的效率就提高上來了。

參考

緩存一致性(Cache Coherency)入門
CAS指令與MESI緩存一致性協議


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM