ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION256 / 1500

두 코어가 서로 다른 변수에 쓴 뒤 읽는 순서가 예상과 다릅니다. cache coherence와 memory consistency 중 어느 계약이 깨졌다고 말해야 하나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

이 사례를 먼저 “coherence 위반”이라고 부르면 안 됩니다. coherence는 한 주소 또는 cache line의 복사본과 수정 순서를 조정하고, consistency는 서로 다른 주소의 작업을 어떤 순서로 관찰할 수 있는지 정합니다. 따라서 x와 y의 각 line이 최신 값 하나를 유지해도 두 주소 사이의 전역 순서가 프로그램 직관과 같다는 보장은 별도입니다.

구체적으로 초기 x=0, y=0에서 A가 x.store(1, relaxed) 뒤 r1=y.load(relaxed), B가 y.store(1, relaxed) 뒤 r2=x.load(relaxed)를 수행한다고 합시다. 두 store가 각자의 store buffer에 잠시 남아 있으면 A와 B가 각각 상대 주소의 0을 읽어 r1=0, r2=0이 되는 store-buffering 결과를 검토할 수 있습니다. 이것은 x와 y의 동일 주소 coherence가 깨졌다는 증거가 아니라, relaxed 연산이 두 주소 사이의 순서를 동기화하지 않는다는 문제입니다. C++에서 비원자 x,y를 같은 방식으로 접근하면 data race가 되어 결과를 하드웨어 trace만으로 해석할 수도 없습니다.

반대 사례로 생산자가 data=42 후 flag.store(1, release)를 하고 소비자가 flag.load(acquire)에서 1을 읽은 뒤 data를 읽는다면, 그 acquire가 해당 release 값을 읽는 조건에서 공개 관계가 생깁니다. 이때도 data의 수명과 동시 재수정 여부는 따로 확인해야 합니다. 진단 순서는 주소별 coherence 상태, 원자 memory order, 실제 동기화 관계, 객체 lifetime 순으로 나누는 것이 좋습니다. 두 변수가 같은 cache line이어도 line 무효화 비용은 달라질 뿐, line coherence 자체가 cross-address consistency를 대신하지 않습니다. fence를 넣을 때도 “어떤 store를 어떤 load가 관찰해야 하는가”를 먼저 쓰고 비용과 필요한 순서를 검증하겠습니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • coherence를 한 위치의 복사본·수정 순서, consistency를 여러 위치의 관찰 순서로 구분합니다.
  • relaxed x/y store-buffering에서 r1=0, r2=0이 가능한 이유를 두 store buffer와 함께 추적합니다.
  • release/acquire가 실제 release 값을 읽었을 때만 data 공개 관계를 만든다는 조건을 붙입니다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • 모든 coherent cache가 sequential consistency를 자동 제공한다고 말하면 계약 층위를 합친 것입니다.
  • 일반 비원자 접근의 data race를 원자성이나 cache freshness만으로 덮으면 안 됩니다.
  • 한 번 관찰한 순서를 모든 실행의 보장으로 일반화하면 memory model의 허용 범위를 잘못 말합니다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

  • 두 변수가 같은 line일 때 무효화 비용과 cross-address ordering이 왜 별개인지 비교합니다.
  • fence 설계와 release/acquire flag 설계에서 실제 증명 지점을 각각 적습니다.

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

← 전체 질문 보기