프로그래머는 캐쉬 데이터를 관리할 수 없다. 하드웨어에서 업데이트해서 사용하기 때문이다.
코어0, 1에서 병렬적으로 처리한다고 가정한다면, 위 테이블대로 처리한다면 z1의 값은 28
이 나올 것이다. 하지만 x가 저장된 Cache 0
가 오랜 시간동안 사용되지 않아 사라지고 이후 Core 1
에서 접근하려한다면, Hit miss가 발생하여 이전 x 값인 2
를 참조할 수도 있다. 이러면 z1
의 값은 8
이 드물게 나올 수 있다는 뜻이다. 우리는 캐시를 동기화, 즉 Cache Coherence를 해줘야 한다.
이러한 문제를 해결하는 알고리즘이 있다.
코어는 하나의 버스를 공유하며, 버스에서 snooper라는 캐시 컨트롤러가 버스의 모든 이벤트(읽기 쓰기 등)를 관리한다.
코어 0가 x의 복사본을 코어0의 캐시에 업데이트하면 버스에 업데이트된 정보를 전달한다. 만약 코어1이 버스에 "Snooping"을 한다면 x는 업데이트되고 invalid시킬 수 있다(X의 값이 업데이트됐으니 이전 X는 필요없기 때문이다). 소규모 네트워크에서 사용된다(크면 버스 혼잡도가 증가하기 때문이다).
각 캐시 라인의 상태를 보관중인 "디렉토리"라 불리는 데이터 구조를 사용한다. 위 버스 네트워크 대신 대규모 Distributed Shared Memory에서 사용되는 방식이다. 내용이 복잡하기 때문에, 하드웨어적으로 이런 게 있구나 라고만 설명하겠음.