MSI, MESI, MOESI 프로토콜의 차이점 정리

MSI, MESI, MOESI는 멀티코어의 각 캐시가 가진 라인에 상태를 붙여, 같은 주소의 데이터가 어긋나지 않도록 하는 프로토콜입니다. MSI는 Modified, Shared, Invalid의 3가지 상태만 있는 기본형입니다. MESI는 Exclusive(자신만 가지고 있고 메모리와 같은 내용)를 추가해, 다른 코어가 가지고 있지 않은 데이터에 쓸 때 버스 통신을 생략할 수 있습니다. MOESI는 여기에 Owned 상태를 더해, 수정한 데이터를 메모리에 라이트백하지 않은 채 다른 캐시와 공유할 수 있습니다.

비교 항목MSIMESIMOESI
상태 수3개(M, S, I)4개(M, E, S, I)5개(M, O, E, S, I)
Modified(M)자신만 가지고 있고, 내용이 메모리와 다름동일동일
Shared(S)다른 캐시도 가지고 있을 가능성이 있음. 내용은 메모리와 같음동일다른 캐시도 가지고 있을 가능성이 있음. 내용이 메모리와 다를 수도 있음(O 상태 라인이 있을 때)
Exclusive(E)없음자신만 가지고 있고, 내용이 메모리와 같음있음(MESI와 동일)
Owned(O)없음없음내용은 메모리와 다르지만 다른 캐시도 S로 공유 중. 메모리 라이트백 책임을 가짐
다른 코어가 가지고 있지 않은 데이터를 읽을 때S 상태로 들어옴E 상태로 들어옴E 상태로 들어옴
그 데이터에 쓸 때S에서 M으로 바꾸기 위해 다른 복사본을 무효화하는 요청을 버스 등에 냄E에서 M으로 통신 없이 바뀔 수 있음E에서 M으로 통신 없이 바뀔 수 있음
M 라인을 다른 코어가 읽을 때메모리에 라이트백하고, 양쪽 모두 S 상태가 됨메모리에 라이트백하고, 양쪽 모두 S 상태가 됨(데이터는 캐시에서 직접 전달하기도 함)라이트백하지 않고 데이터를 전달하며, 자신은 O 상태, 상대는 S 상태가 됨
메모리 라이트백수정된 라인을 다른 코어가 읽을 때마다 발생수정된 라인을 다른 코어가 읽을 때마다 발생O 상태 라인이 축출될 때까지 미룰 수 있음
상태 비트 수와 복잡도2비트. 가장 간단함2비트. 중간3비트. 가장 복잡함

수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.

상황별 선택 기준

MSI
일관성 구조를 배울 때의 기본형. 상태 전이를 최대한 간단하게 하고 싶을 때.
MESI
한 코어만 사용하는 데이터의 읽기·쓰기가 많을 때. E 상태 덕분에 읽은 뒤 쓰는 처리에서 통신을 생략할 수 있습니다. 많은 멀티코어 CPU 프로토콜의 토대가 되고 있습니다.
MOESI
코어끼리 수정한 데이터를 자주 주고받을 때. 메모리 라이트백을 줄여 메모리 대역폭을 절약하고 싶을 때.

자주 묻는 질문

MESI의 E 상태가 있으면 무엇이 좋은가요?

다른 코어가 가지고 있지 않은 데이터를 읽으면 E 상태가 되고, 그 뒤 쓸 때 다른 코어에 알리지 않고 M 상태로 바뀔 수 있습니다. MSI에서는 같은 경우에 S 상태로 들어오므로 쓸 때마다 무효화 요청을 내야 합니다. 한 스레드만 사용하는 데이터의 '읽은 뒤 쓰기' 처리에서 버스 통신을 줄일 수 있습니다.

MOESI의 O 상태가 있으면 무엇이 좋은가요?

수정한 데이터(M 상태)를 다른 코어가 읽을 때, MESI에서는 메모리에 라이트백한 뒤 공유하지만, MOESI에서는 라이트백하지 않고 캐시끼리 데이터를 전달하며, 원래 캐시가 O 상태로서 라이트백 책임을 계속 집니다. 메모리 쓰기를 줄일 수 있습니다.

E 상태와 M 상태는 어떻게 다른가요?

둘 다 그 라인을 가진 것은 자신의 캐시뿐입니다. E 상태는 내용이 메모리와 같으므로 축출할 때 라이트백할 필요가 없습니다. M 상태는 수정되어 메모리와 내용이 다르므로 축출할 때 라이트백이 필요합니다.

이 프로토콜들은 스누핑과 디렉터리 방식 중 어디에 쓰이나요?

둘 다에 쓸 수 있습니다. MSI, MESI, MOESI는 라인 상태를 정하는 방법이며, 다른 캐시에 알리는 방법(공유 버스 등을 감시하는 스누핑인지, 라인 소유자를 기록하는 디렉터리 방식인지)과는 별개의 이야기입니다.

이해도 확인

캐시 코히런시 프로토콜인 MESI의 네 가지 상태의 조합으로 올바른 것은 무엇입니까?

  1. AMemory, Execute, Store, Index
  2. BModified, Exclusive, Shared, Invalid
  3. CMiss, Evict, Swap, Idle
정답과 해설 보기

정답: B. Modified, Exclusive, Shared, Invalid

MESI에서는 캐시의 각 라인이 변경되었고 자신만 가지고 있는 Modified, 변경은 없지만 자신만 가지고 있는 Exclusive, 여러 코어가 같은 내용을 가지고 있는 Shared, 무효인 Invalid 중 하나의 상태를 가집니다. 코어가 읽고 쓰거나 다른 코어의 읽기와 쓰기를 알게 될 때마다 상태가 전이되어, 같은 주소의 데이터 불일치를 방지합니다.

MESI 프로토콜에서 캐시 라인이 Modified(M) 상태일 때의 의미로 올바른 것은 무엇입니까?

  1. A이 코어만 해당 라인을 가지고 있고, 내용이 주기억 장치와 다르다(라이트백이 필요하다)
  2. B여러 코어가 같은 내용을 가지고 있고, 주기억 장치와도 일치한다
  3. C이 라인의 내용은 사용할 수 없으며, 읽으려면 다시 가져와야 한다
정답과 해설 보기

정답: A. 이 코어만 해당 라인을 가지고 있고, 내용이 주기억 장치와 다르다(라이트백이 필요하다)

M 상태는 이 코어가 쓰기를 수행하여 최신 값을 자신만 가지고 있는 상태입니다. 주기억 장치의 값은 오래되었으므로, 이 라인을 축출할 때나 다른 코어가 읽으려 할 때 최신 값을 라이트백하거나 직접 전달해야 합니다. M 상태의 라인에는 다른 코어에 알리지 않고 그대로 몇 번이고 쓸 수 있으므로, 같은 코어가 연속해서 쓸 때 빠르게 처리할 수 있습니다.

MESI 프로토콜에서 Exclusive(E) 상태의 라인에 해당 코어가 쓸 때의 동작으로 올바른 것은 무엇입니까?

  1. A다른 모든 코어에 무효화 요청을 보낸 뒤에 쓴다
  2. B쓸 수 없으므로 일단 주기억 장치에 쓴 뒤 다시 읽는다
  3. C다른 코어에 알릴 필요 없이 그대로 M 상태로 바뀐다
정답과 해설 보기

정답: C. 다른 코어에 알릴 필요 없이 그대로 M 상태로 바뀐다

E 상태는 이 코어만 라인을 가지고 있고 내용이 주기억 장치와 같은 상태입니다. 다른 코어에 사본이 없다는 것을 알고 있으므로, 쓸 때 무효화 통지를 하지 않고 M 상태로 전이할 수 있습니다. 하나의 코어만 사용하는 데이터를 읽은 뒤 쓰는 흔한 처리에서 통신을 생략할 수 있는 것이 E 상태를 두는 장점입니다. S 상태에서 쓰는 경우에는 다른 사본의 무효화가 필요합니다.

  1. 무효화형 코히런시 프로토콜에서 어떤 코어가 Shared(S) 상태의 라인에 쓸 때 수행되는 것은 무엇입니까?
  2. MESI 프로토콜에서 코어 0이 Modified(M) 상태로 가진 라인을 코어 1이 읽으려 할 때의 일반적인 동작은 무엇입니까?
  3. 캐시 코히런시의 스누핑 방식에 대한 설명으로 올바른 것은 무엇입니까?

멀티코어와 동기화 문제 풀기

주요 용어 설명

MESI 프로토콜
캐시의 각 라인을 Modified·Exclusive·Shared·Invalid의 4가지 상태로 관리하는 일관성 프로토콜. 쓰기 시 다른 코어의 사본을 무효화한다.
캐시 일관성(Cache Coherency)
멀티코어 CPU에서 각 코어의 캐시에 같은 주소의 데이터가 있을 때 그 내용의 일관성을 유지하는 방식. 한 코어가 값을 고치면 다른 코어의 오래된 사본을 무효화하는 식으로 구현한다.
스누핑(snooping)
각 캐시가 공유 버스 등에 흐르는 다른 코어의 읽기·쓰기를 감시하며 자신의 라인 상태를 바꾸는 코히어런시 방식. 코어 수가 적을 때 적합하다.
캐시 라인(Cache Line)
캐시와 하위 계층 사이에서 데이터를 읽고 쓰는 단위. 캐시 블록이라고도 한다. 대부분의 CPU에서는 64바이트이며, 주소의 하위 비트가 라인 내 위치(오프셋)를 나타낸다.
디렉터리 방식(Directory-based Coherence)
각 라인을 어느 코어가 가지고 있는지 표에 기록하고 관련된 코어에만 알리는 코히런스 방식. 코어 수가 많은 시스템에서 사용된다.

관련 비교