MESI 프로토콜로 보는 캐시 일관성과 상태 전이
MESI 프로토콜의 캐시 상태와 읽기·쓰기 전이, 버스 트랜잭션, 변형 프로토콜 및 성능 분석 기준을 실무 관점에서 정리한다.
2026-08-14 · 최초 발행 2025-12-28
여러 캐시가 같은 데이터를 다룰 때의 규칙
멀티프로세서에서는 같은 메모리 데이터를 여러 캐시가 동시에 보관할 수 있다. 이때 각 캐시의 복사본이 서로 다른 값을 가리키지 않도록 관리하는 하드웨어 메커니즘이 필요하다.
MESI는 Modified, Exclusive, Shared, Invalid의 상태를 이용해 이 문제를 다룬다. Write Invalidate 방식의 Snoopy 프로토콜이며 Write Back 정책을 사용한다. 캐시 라인의 유효성을 상태 플래그로 판단하면서 버스 트래픽과 메모리 대역폭 사용을 줄이고, 성능과 일관성 사이의 균형을 맞춘다.
각 캐시 라인이 가질 수 있는 상태
Modified (M, 수정)
Modified는 캐시 안의 데이터가 변경되어 주기억장치의 값과 일치하지 않는 상태다. 유효한 복사본은 해당 캐시에만 있고, 메모리 업데이트 책임도 이 캐시에 있다.
다른 프로세서가 읽기를 요청하면 Shared로 바뀐다. 캐시 라인이 교체될 때는 Write Back을 수행한 뒤 Invalid 상태가 된다.
Exclusive (E, 배타)
Exclusive는 수정되지는 않았지만 해당 캐시만 유효한 복사본을 보유하는 상태다. 데이터는 주기억장치와 동일하며 다른 캐시에는 복사본이 없다.
이 상태에서는 로컬 쓰기가 발생해도 무효화 신호가 필요하지 않고 바로 Modified로 전이한다. 다른 프로세서의 읽기 요청을 받으면 Shared로 변경된다.
Shared (S, 공유)
Shared는 두 개 이상 프로세서의 캐시에 같은 데이터가 적재된 경우다. 데이터는 메인 메모리와 일치하고 여러 캐시가 동시에 읽을 수 있지만, 쓰기 전에는 다른 복사본을 무효화해야 한다.
로컬 쓰기는 다른 복사본을 무효화한 뒤 Modified로 전이한다. 다른 프로세서의 쓰기를 감지하면 이 캐시 라인은 Invalid가 된다.
Invalid (I, 무효)
Invalid는 캐시 라인이 더 이상 사용할 수 없는 상태다. 다른 프로세서의 쓰기, 캐시 라인 교체, 초기 상태가 이 전이의 원인이 된다. 이 상태에서 접근하면 캐시 미스가 발생한다.
읽기 요청은 Shared 또는 Exclusive 상태를 얻는 계기가 되고, 쓰기 요청은 Modified 상태로 전이한다.
읽기와 쓰기가 만드는 상태 전이
캐시 미스가 난 읽기 요청은 버스에 브로드캐스트되고 다른 캐시의 상태를 확인한다. Modified 상태의 캐시가 있으면 그 캐시가 데이터를 제공하며, 그렇지 않으면 메모리에서 읽는다. 다른 캐시에 복사본이 없으면 Exclusive, 있으면 Shared 상태가 된다.
쓰기 경로는 현재 상태에 따라 달라진다. Invalid에서 쓰려면 Read For Ownership으로 읽기 권한을 얻고 다른 복사본을 무효화한 뒤 Modified로 바뀐다. Exclusive에서는 이미 독점 상태이므로 즉시 Modified로 전이한다. Shared에서의 쓰기는 무효화 신호를 브로드캐스트해 다른 복사본을 Invalid로 만든 뒤 Modified 상태가 된다.
상태별 요청 처리 결과
| 현재 상태 | 로컬 읽기 | 로컬 쓰기 | 원격 읽기 | 원격 쓰기 |
|---|---|---|---|---|
| Invalid | E 또는 S | M | - | - |
| Exclusive | E | M | S | I |
| Shared | S | M (무효화) | S | I |
| Modified | M | M | S (WB) | I (WB) |
WB는 Write Back 수행을 뜻한다.
버스에서 오가는 요청
Invalid 상태에서 읽기 미스가 발생하면 BusRd 신호가 발생한다. 다른 캐시의 상태를 확인한 뒤 데이터를 획득하고 상태를 설정한다.
Invalid 상태에서 쓰기를 시작하는 경우에는 BusRdX 신호를 사용하는 Read For Ownership이 발생한다. 이 요청은 다른 모든 복사본을 무효화하고 캐시 라인을 Modified 상태로 전이시킨다.
Modified 상태의 라인이 교체되거나 원격 요청을 받으면 BusWB 신호로 메모리를 업데이트한다. 이후 상태는 Shared 또는 Invalid가 된다. Shared 상태에서의 쓰기는 BusInv 신호를 발생시켜 다른 복사본을 모두 Invalid로 만든다.
버스 기반 일관성 방식의 강점과 제약
Exclusive 상태는 불필요한 트래픽을 줄이고, Write Back은 메모리 접근을 최소화한다. 로컬 쓰기를 즉시 처리할 수 있으며 읽기 공유를 통해 캐시 활용도도 높아진다. 프로세서 수가 늘어날 때의 성능 저하를 완화하므로 소규모~중규모 시스템에 적합하다.
반면 서로 다른 변수가 같은 캐시 라인에 놓이면 False Sharing으로 인해 불필요한 무효화가 발생할 수 있다. 여러 프로세서가 동시에 쓰기를 시도하면 Invalidate Storm으로 무효화 신호가 급증한다. 버스 기반 방식은 일반적으로 64개 미만 프로세서에서 한계가 있어, 대규모 시스템에서는 디렉토리 프로토콜로 대체할 필요가 있다.
확장된 상태 모델과 구현
MESIF는 Intel에서 사용하는 변형으로 Forward(F) 상태를 추가한다. Shared 상태 가운데 하나의 캐시만 Forward로 지정해 읽기 요청에 하나의 캐시만 응답하게 하며, 이를 통해 전력을 절약한다.
AMD의 MOESI는 Owned(O) 상태를 추가한다. Modified 데이터를 공유하면서 메모리 업데이트를 지연할 수 있어 Write Back 지연에 따른 성능 향상을 제공한다.
MOSI는 Exclusive 상태를 제거해 상태 수를 줄이고 하드웨어를 단순화한다. 그 대신 일부 최적화 기회를 잃는다.
Intel Core 시리즈는 MESIF 프로토콜을, AMD Ryzen은 MOESI 프로토콜을 사용한다. ARM Cortex-A는 MESI 기반 변형을 사용하며, IBM Power는 MESI 기반에 디렉토리 프로토콜을 결합한다.
성능을 볼 때 확인할 항목
캐시 라인 크기는 일반적으로 64바이트이고, 상태 비트 오버헤드는 캐시 라인당 2비트가 필요하다. 프로토콜 전이 지연은 수 사이클~수십 사이클이며, 버스 점유 시간은 시스템 성능에 직접적인 영향을 준다.