緩存一致性協議
操作系統的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的效率就提高上來了。