캐시 일관성

섬네일|upright=1.7|두 클라이언트가 특정 메모리 블록의 캐시된 복사본을 가지고 있고 한 클라이언트가 블록을 변경하는 경우, 다른 클라이언트의 복사본은 무효화되거나 업데이트되어야 한다. 그렇지 않으면 시스템은 비일관성 상태에 있게 된다. 즉, 동일한 메모리 블록에 대한 두 개의 다른 레코드가 모두 최신이라고 주장하는 상태가 된다.
섬네일|비일관성 캐시: 캐시들이 단일 주소 위치에 대해 다른 값을 가진다.
컴퓨터 구조에서 **캐시 일관성**(cache coherence)은 여러 로컬 캐시에 저장된 공유 리소스 데이터의 균일성을 의미한다. 캐시 일관성 시스템에서 여러 클라이언트가 공유 메모리 리소스의 동일한 영역에 대한 캐시된 복사본을 가지고 있다면, 모든 복사본은 동일하다. 캐시 일관성이 없으면 한 클라이언트가 해당 영역에 변경을 가했을 때 다른 클라이언트에게 보이지 않을 수 있으며, 다른 클라이언트가 사용하는 데이터가 일치하지 않아 오류가 발생할 수 있다.

캐시 일관성 프로토콜은 캐시 일관성을 유지하는 데 사용된다. 주요 두 가지 유형은 버스 스누핑 및 디렉터리 기반 프로토콜이다.

캐시 일관성은 각 CPU가 공유 메모리 리소스의 자체 로컬 캐시를 가질 수 있는 다중 처리 시스템에서 특히 중요하다.

섬네일|일관성 캐시: 모든 캐시 복사본의 값이 동일하다.

## 개요
각 프로세서에 대해 별도의 캐시 메모리를 가진 공유 메모리 다중 프로세서 시스템에서는 공유 데이터의 여러 복사본이 존재할 수 있다. 즉, 주 메모리에 하나, 그리고 요청한 각 프로세서의 로컬 캐시에 하나씩 존재할 수 있다. 데이터 복사본 중 하나가 변경되면 다른 복사본도 그 변경 사항을 반영해야 한다. 캐시 일관성은 공유 피연산자(데이터) 값의 변경이 시스템 전체에 적시에 전파되도록 보장하는 규율이다.

캐시 일관성에 대한 요구사항은 다음과 같다:
;쓰기 전파: 모든 캐시의 데이터 변경은 피어 캐시에 있는 다른 복사본(해당 캐시 라인)에 전파되어야 한다.
;트랜잭션 직렬화: 단일 메모리 위치에 대한 읽기/쓰기는 모든 프로세서에 의해 동일한 순서로 보여야 한다.
이론적으로 일관성은 로드/저장 세분도에서 수행될 수 있다. 그러나 실제로는 일반적으로 캐시 블록의 세분도에서 수행된다.

## 정의
일관성은 단일 주소 위치에 대한 읽기 및 쓰기의 동작을 정의한다.

다중 프로세서 시스템에서 하나 이상의 프로세서가 메모리 위치 X의 복사본을 캐시했다고 가정해 보자. 캐시 일관성을 달성하기 위해 다음 조건이 필요하다.
# 프로세서 P가 위치 X에 대해 읽기를 수행하고, 그 이전에 동일한 프로세서 P가 X에 대해 쓰기를 수행했으며, P가 수행한 쓰기 및 읽기 명령어 사이에 다른 프로세서가 X에 대해 쓰기를 수행하지 않은 경우, X는 항상 P가 쓴 값을 반환해야 한다.
# 프로세서 P1이 위치 X에 대해 읽기를 수행하고, 그 이전에 다른 프로세서 P2가 X에 대해 쓰기를 수행했으며, 두 액세스 사이에 다른 프로세서가 X에 대해 쓰기를 수행하지 않았고 읽기와 쓰기가 충분히 분리된 경우, X는 항상 P2가 쓴 값을 반환해야 한다. 이 조건은 메모리의 일관된 뷰 개념을 정의한다. 공유 메모리 위치에 대한 쓰기를 전파하면 모든 캐시가 메모리의 일관된 뷰를 가지게 된다. 프로세서 P1이 P2의 쓰기 이후에도 X의 이전 값을 읽는다면 메모리가 비일관성 상태라고 말할 수 있다.
위의 조건들은 캐시 일관성에 필요한 쓰기 전파 기준을 만족한다. 그러나 트랜잭션 직렬화 조건을 만족하지 못하므로 충분하지 않다. 이를 더 잘 설명하기 위해 다음 예시를 고려해 보자.

다중 프로세서 시스템은 네 개의 프로세서(P1, P2, P3, P4)로 구성되어 있으며, 모두 초기 값이 0인 공유 변수 S의 캐시된 복사본을 가지고 있다. 프로세서 P1은 (자신이 캐시한 복사본에서) S의 값을 10으로 변경한 후, 프로세서 P2는 (자신이 캐시한 복사본에서) S의 값을 20으로 변경한다. 쓰기 전파만 보장한다면 P3와 P4는 P1과 P2가 S에 가한 변경 사항을 확실히 보게 될 것이다. 그러나 P3는 P2가 가한 변경을 본 후에 P1이 가한 변경을 볼 수 있으므로, S를 읽을 때 10을 반환할 수 있다. 반면 P4는 P1과 P2가 가한 변경을 그들이 발생한 순서대로 볼 수 있으므로, S를 읽을 때 20을 반환할 수 있다. 이제 프로세서 P3와 P4는 메모리에 대해 비일관적인 뷰를 가지게 된다.

따라서 트랜잭션 직렬화를 만족하고, 그 결과 캐시 일관성을 달성하기 위해서는 이 섹션에서 언급된 앞의 두 조건과 함께 다음 조건이 충족되어야 한다.
* 동일한 위치에 대한 쓰기는 순서가 정해져야 한다. 다시 말해, 위치 X가 어떤 두 프로세서로부터 A와 B라는 두 가지 다른 값을 이 순서대로 받았다면, 프로세서들은 위치 X를 B로 읽은 다음 A로 읽을 수 없다. 위치 X는 A와 B 값으로 그 순서대로 보여야 한다.
일관성 있는 시스템의 다른 정의는 순차적 일관성 메모리 모델의 정의를 통한 것이다: "캐시 일관성 시스템은 모든 스레드의 단일 메모리 위치에 대한 로드 및 저장을 각 스레드의 프로그램 순서를 존중하는 총체적 순서로 실행하는 것처럼 보여야 한다." 따라서 캐시 일관성 시스템과 순차적 일관성 시스템의 유일한 차이점은 정의가 다루는 주소 위치의 수에 있다 (캐시 일관성 시스템의 경우 단일 메모리 위치, 순차적 일관성 시스템의 경우 모든 메모리 위치).

또 다른 정의는 다음과 같다: "다중 프로세서는 동일한 메모리 위치에 대한 모든 쓰기가 어떤 순차적 순서로 수행되는 경우 캐시 일관성을 가진다."

드물지만, 특히 알고리즘에서 일관성은 참조 국부성을 의미할 수도 있다.
동일한 데이터의 여러 복사본이 서로 다른 캐시에 동시에 존재할 수 있으며, 프로세서가 자신의 복사본을 자유롭게 업데이트하도록 허용하면 메모리의 일관성 없는 뷰가 발생할 수 있다.

## 일관성 메커니즘

일관성을 보장하는 가장 일반적인 두 가지 메커니즘은 스누핑과 디렉터리 기반이며, 각각 장단점을 가지고 있다. 스누핑 기반 프로토콜은 충분한 메모리 대역폭이 있다면 더 빠른 경향이 있는데, 모든 트랜잭션이 모든 프로세서에 의해 보여지는 요청/응답이기 때문이다. 단점은 스누핑이 확장성이 떨어진다는 것이다. 모든 요청은 시스템의 모든 노드에 브로드캐스트되어야 하므로 시스템이 커질수록 (논리적 또는 물리적) 버스의 크기와 제공하는 대역폭이 증가해야 한다. 반면 디렉터리는 더 긴 지연 시간(3 홉 요청/전달/응답)을 가지지만, 메시지가 점대점(point to point)이고 브로드캐스트가 아니기 때문에 훨씬 적은 대역폭을 사용한다. 이러한 이유로 많은 대규모 시스템(>64 프로세서)은 이러한 유형의 캐시 일관성을 사용한다.

### 스누핑

: 1983년에 처음 도입된 스누핑은 개별 캐시가 자신이 캐시한 메모리 위치에 대한 접근을 위해 주소 라인을 모니터링하는 과정이다. 쓰기-무효화 프로토콜과 쓰기-업데이트 프로토콜이 이 메커니즘을 사용한다.

: 스누핑 메커니즘을 위해, 스눕 필터는 하나 이상의 노드에 의해 소유될 수 있는 캐시 라인을 나타내는 다수의 항목을 유지함으로써 스누핑 트래픽을 줄인다. 항목 중 하나를 교체해야 할 때, 스눕 필터는 각 항목의 존재 벡터로부터 결정된 바와 같이 가장 적은 노드에 의해 소유된 캐시 라인 또는 라인을 나타내는 항목을 선택한다. 가장 적은 노드에 의해 둘 이상의 캐시 라인이 소유되는 경우, 시간적 또는 다른 유형의 알고리즘을 사용하여 선택을 정제한다.

### 디렉터리 기반

: 디렉터리 기반 시스템에서 공유되는 데이터는 캐시 간의 일관성을 유지하는 공통 디렉터리에 배치된다. 디렉터리는 프로세서가 주 메모리에서 캐시로 항목을 로드하기 위해 허가를 받아야 하는 필터 역할을 한다. 항목이 변경되면 디렉터리는 해당 항목을 가진 다른 캐시를 업데이트하거나 무효화한다.
분산 공유 메모리 시스템은 이러한 메커니즘을 모방하여 느슨하게 결합된 시스템에서 메모리 블록 간의 일관성을 유지하려고 시도한다.

## 일관성 프로토콜
일관성 프로토콜은 다중 프로세서 시스템에서 캐시 일관성을 적용한다. 그 의도는 두 클라이언트가 동일한 공유 데이터에 대해 서로 다른 값을 보지 않도록 하는 것이다.

프로토콜은 일관성에 대한 기본 요구사항을 구현해야 한다. 이는 대상 시스템 또는 애플리케이션에 맞게 맞춤 제작될 수 있다.

프로토콜은 스누핑 또는 디렉터리 기반으로 분류될 수도 있다. 일반적으로 초기 시스템은 공유되는 데이터와 공유자를 추적하는 디렉터리를 사용하는 디렉터리 기반 프로토콜을 사용했다. 스누핑 프로토콜에서는 트랜잭션 요청(읽기, 쓰기 또는 업그레이드)이 모든 프로세서로 전송된다. 모든 프로세서는 요청을 스누핑하고 적절하게 응답한다.

스누핑 프로토콜의 쓰기 전파는 다음 방법 중 하나로 구현될 수 있다:
;쓰기-무효화: 캐시가 복사본을 가진 위치에 대한 쓰기 작업이 관찰되면, 캐시 컨트롤러는 스누핑된 메모리 위치의 자체 복사본을 무효화하여 다음 액세스 시 주 메모리로부터 새 값을 강제로 읽어오게 한다.
;쓰기-업데이트: 캐시가 복사본을 가진 위치에 대한 쓰기 작업이 관찰되면, 캐시 컨트롤러는 스누핑된 메모리 위치의 자체 복사본을 새 데이터로 업데이트한다.
프로토콜 설계가 공유 데이터의 모든 복사본이 변경될 때마다 다른 모든 복사본이 변경을 반영하도록 "업데이트"되어야 한다고 명시하는 경우, 이는 쓰기-업데이트 프로토콜이다. 설계가 어떤 프로세서에 의한 캐시된 복사본에 대한 쓰기가 다른 프로세서가 캐시된 복사본을 폐기하거나 무효화하도록 요구한다고 명시하는 경우, 이는 쓰기-무효화 프로토콜이다.

그러나 확장성은 브로드캐스트 프로토콜의 한 가지 단점이다.

MSI, MESI (일리노이), MOSI, MOESI, MERSI, MESIF, 쓰기 한 번, 시냅스, 버클리, 파이어플라이 및 드래곤 프로토콜과 같이 일관성을 유지하기 위해 다양한 모델과 프로토콜이 고안되었다. 2011년 ARM Ltd는 SoC에서 일관성을 처리하기 위해 AMBA 4 ACE를 제안했다. AMBA5 그룹 사양에 속하는 ARM Ltd의 AMBA CHI (Coherent Hub Interface) 사양은 완전한 일관성을 가진 프로세서 연결을 위한 인터페이스를 정의한다.

## 같이 보기
* 일관성 모델
* 메모리 배리어
* 불균일 기억 장치 접근

## 각주


분류:병렬 컴퓨팅
분류:일관성 모델