Cache中的內容是主存中的副本。訪問數據是先訪問Cache,Cache中沒有再看主存中有沒有。當對cache中的內容更新時,就會存在cache和主存如何保持數據一致的問題。此外,下列問題也會導致cache一致性問題。
- 多個設備都允許訪問主存時,cache中的內容被cpu修改,而主存中的沒有,同時該內容需要寫入磁盤,此時從內存寫入到磁盤的數據和cache(希望的數據)不一樣。
- 當多個CPU都有各自的cache而共享主存時,若有一個cpu修改了自身cache中的內容,則對應的主存塊和其他cpu中對應的cache行的內容都變為無效(共享數據,數據更改了,未及時更改的那些數據都沒用了)
Cache一致性問題的關鍵是處理好寫操作。
全寫法
對寫命中,寫未命中的解釋:cache的寫命中和寫未命中,就是磁盤或者內存上的存儲區域之前有沒有寫過數據。如果有,這次再寫到相同的區域叫寫命中;如果寫到其他區域,叫寫未命中。
寫操作時,若寫命中,則同時寫cache和主存;若寫不命中,則有以下兩種方式。
- 寫分配法:
- 先更新主存中的數據,再將更新后的主存塊裝入到cache中。可重復利用程序的局部性原理。
- 非寫分配法:
- 僅更新主存中數據不寫入cache,可減少讀入主存塊的時間,但是沒有很好地利用程序地局部性原理。
- 為減少寫主存地開心,通常再cache和主存之間加一個寫緩沖,寫入cache時也寫入緩沖中,然后由存儲控制器將寫緩沖中的數據寫入主存。(寫緩沖的讀取速度很快,遠遠高於對主存的讀取速度)
回寫法
CPU執行寫操作時,若寫命中,則信息只寫入cache不寫入主存;若寫不命中,則在cache中分配一行,將主存塊調入該cache行中並更新相應單元的內容。該方式下,寫不命中時通常采用寫分配法進行寫操作。
我個人理解,寫命中就是這個數據在cahce和內存里,但是內容不對需要更新。寫未命中就是,這個數據不在內存,也不在cache,需要申請一塊新的空間存放它。