CS
[운영체제] 캐시 일관성과 MESI 프로토콜
sangyunpark99
2025. 4. 25. 10:41
캐시 일관성이 필요한 이유
멀티코어 시스템에서는 각 CPU 코어마다 자체 캐시(L1, L2 등)을 갖고 있습니다.
이 캐시들은 공유 메모리(RAM)의 일부 데이터를 복사해서 로컬하게 저장하고 사용합니다.
그런데 여러 CPU가 동일한 메모리 주소를 읽고 쓰게 되면 문제가 발생합니다.
int x = 0; // 공유 변수
// (CPU1)
x = 1;
// (CPU2)
printf("%d\n",x); // 0이 출력될 수 있습니다.
위 코드처럼 CPU1이 x = 1로 값을 바꿨지만, CPU2는 여전히 이전 값 0을 자신의 캐시에서 읽어올 수 있습니다. 즉, CPU 간 캐시가 일관되지 않은 상태가 되는 거죠.
이러한 문제를 해결하기 위해 캐시 일관성 프로토콜이 필요합니다.
MESI 프로토콜
현대 CPU는 대부분 MESI (Modified, Exclusive, Shared, Invalid) 프로토콜을 사용해 캐시의 일관성을 유지합니다.
상태 | 의미 |
Modified | 나만 변경한 상태, 메모리에 안 반영됨 |
Exclusive | 내가 유일하게 가지고 있고 값은 메모리와 동일함 |
Shared | 여러 CPU가 동시에 이 값을 읽은 상태 |
Invalid | 이 캐시 값은 더 이상 유효하지 않음(다른 CPU가 수정) |
MESI 프로토콜 동작 예시
쓰기 경쟁시 캐시 일관성을 보장하는 예시를 들면 아래와 같습니다.
1. CPU1과 CPU2가 모두 x의 캐시를 읽어 Shared 상태를 가집니다.
2. CPU1이 x = 1로 값을 바꾸려 하면, CPU2의 해당 x 캐시 상태를 Invalid로 강제 무효화 시킵니다. CPU1은 Modified로 값을 수정합니다.
3. 이후 CPU2가 다시 x를 읽으면, 자신의 캐시 값이 무효화되었으므로 다시 메인 메모리 또는 CPU1로부터 최신 값을 받아야 합니다.
이러한 동작은 모두 버스 상의 메시지를 통해 이루어집니다.
즉, 이러한 쓰기 경재이 많을수록 invalidation 메시지가 많아지고, 캐시 간 동기화 비용이 커지면서 성능 병목이 발생합니다.
마무리
- 멀티코어 환경에서는 각 CPU의 캐시 상태를 동기화해주는 캐시 일관성이 중요합니다.
- MESI 프로토콜은 캐시 일관성을 위해 사용되는 대표적인 방법입니다.
- 효율적인 병렬 프로그래밍에서는 캐시 일관성으로 인한 성능 저하를 고려해야 합니다.