{
  "title": "동시성과 메모리 모델",
  "description": "happens-before, 데이터 경합, 순차 일관성, 그리고 공리적 메모리 모델. '허용 동작 = ∃(rf·mo…) 공리 충족' 형태가 왜 문제의 핵심인지.",
  "languageCode": "ko",
  "cards": [
    {
      "type": "ox",
      "prompt": "메모리 모델은 여러 스레드가 공유 메모리를 읽고 쓸 때 어떤 실행 결과가 허용되는지를 규정한다.",
      "answer": true,
      "explanation": "메모리 모델은 '가능한 실행/관측 결과의 집합'을 정의합니다."
    },
    {
      "type": "ox",
      "prompt": "데이터 경합(data race)은 최소 하나가 쓰기인 두 접근이, 동기화 없이(happens-before로 순서지어지지 않은 채) 충돌하는 상황이다.",
      "answer": true,
      "explanation": "충돌 접근(같은 위치, 하나 이상 쓰기)이 happens-before로 정렬되지 않으면 데이터 경합입니다."
    },
    {
      "type": "ox",
      "prompt": "happens-before 관계는 일반적으로 전순서(total order)다.",
      "answer": false,
      "explanation": "happens-before는 부분순서(partial order)입니다. 서로 순서지어지지 않은 사건 쌍이 있을 수 있습니다."
    },
    {
      "type": "choice",
      "prompt": "C++11 이후 동시성 의미론에서 '허용되는 동작'을 정의할 때 존재를 양화(∃)하는 관계가 아닌 것은?",
      "choices": [
        "소스 코드 들여쓰기 규칙",
        "reads-from(rf)",
        "modification order(mo)",
        "sequenced-before"
      ],
      "answer": 1,
      "explanation": "허용 동작은 rf·mo·sequenced-before 등 관계의 존재로 규정됩니다. 들여쓰기는 의미론과 무관합니다."
    },
    {
      "type": "ox",
      "prompt": "공리적(axiomatic) 메모리 모델에서 실행 결과 v의 허용 여부는 '일관성 공리를 만족하는 rf·mo 등의 관계가 존재하는가(∃)'로 규정할 수 있다.",
      "answer": true,
      "explanation": "즉 v ∈ AllowedBehaviors(P) ⇔ ∃(pre, rf, mo, …). Axioms(…). 실행 의미론 안의 비자명한 ∃입니다."
    },
    {
      "type": "ox",
      "prompt": "C++에서 데이터 경합이 있는 프로그램의 동작은 정의되어 있으며 항상 안전하다.",
      "answer": false,
      "explanation": "C++에서 데이터 경합은 미정의 동작(undefined behavior)입니다. 안전이 보장되지 않습니다."
    },
    {
      "type": "choice",
      "prompt": "SC-DRF 보장에 따르면, 데이터 경합이 없는(DRF) 프로그램은 어떤 의미론을 따르는 것으로 볼 수 있는가?",
      "choices": [
        "순차 일관성(sequential consistency)",
        "무작위 실행",
        "컴파일 거부",
        "단일 스레드 전용"
      ],
      "answer": 1,
      "explanation": "데이터 경합이 없으면 프로그램은 순차 일관적인 것처럼 동작합니다(SC-for-DRF)."
    },
    {
      "type": "text",
      "prompt": "한 사건이 다른 사건보다 먼저 '일어난 것으로 보장'되는, 메모리 모델의 부분순서 관계 이름은? (영문 하이픈 표기)",
      "answers": [
        "happens-before",
        "happens before",
        "선행 발생",
        "선행발생"
      ],
      "explanation": "happens-before 관계입니다. 가시성과 순서를 규정하는 핵심 부분순서입니다."
    },
    {
      "type": "ox",
      "prompt": "Java 메모리 모델도 happens-before 관계를 기반으로 가시성과 순서를 규정한다.",
      "answer": true,
      "explanation": "JMM은 happens-before를 중심으로 volatile·락 등의 가시성 규칙을 정의합니다."
    },
    {
      "type": "ox",
      "prompt": "Rust는 원자적 연산(atomics)에 대해 사실상 C++의 메모리 모델을 차용하고 있다.",
      "answer": true,
      "explanation": "Rust의 atomics 순서(Ordering)는 C++20 원자 모델을 따릅니다. (전체 언어의 형식 모델은 아직 확립 진행 중입니다.)"
    },
    {
      "type": "ox",
      "prompt": "순차 일관성(SC)은 현대 CPU가 추가 비용 없이 항상 기본으로 제공한다.",
      "answer": false,
      "explanation": "실제 하드웨어는 성능을 위해 재배열·완화된 순서를 사용하며, SC는 대개 추가 비용(장벽 등)을 동반합니다."
    },
    {
      "type": "ox",
      "prompt": "메모리 모델이 '∃ 관계가 공리를 충족' 형태로 허용 동작을 정의한다는 사실 때문에, ∃ 기반 선언형 정의로는 C++·Java·Rust까지 선언형에 포함되어 버린다.",
      "answer": true,
      "explanation": "이것이 이 커리큘럼의 핵심 논증입니다: 실행 의미론에 비자명한 ∃가 있으니, 그 기준으로도 명령형 언어가 선언형이 됩니다."
    },
    {
      "type": "ox",
      "prompt": "순차 일관성(sequential consistency)은 모든 스레드의 연산을 하나의 전순서로 늘어놓을 수 있고, 그 순서가 각 스레드의 프로그램 순서를 보존할 때 성립한다.",
      "answer": true,
      "explanation": "램포트의 정의 그대로입니다. 즉 '어떤 인터리빙(interleaving) 하나로 설명되는 실행'만 허용됩니다."
    },
    {
      "type": "ox",
      "prompt": "캐시 일관성(coherence)을 보장하는 하드웨어라면 순차 일관성(consistency)도 자동으로 보장된다.",
      "answer": false,
      "explanation": "코히런스는 '단일 메모리 위치'에 대한 보장이고, 일관성 모델은 '서로 다른 위치들 사이의 순서'까지 규정합니다. 코히런트한 기계도 서로 다른 위치의 연산을 재배열해 비-SC 실행을 만들 수 있습니다."
    },
    {
      "type": "choice",
      "prompt": "캐시 일관성(cache coherence)이 보장하는 것은 무엇인가?",
      "choices": [
        "각 메모리 위치 하나에 대한 쓰기들이 모든 스레드에게 모순 없는 하나의 순서로 보인다",
        "서로 다른 위치에 대한 연산 순서까지 전역으로 합의된다",
        "모든 실행이 순차 일관적이 된다",
        "동기화 없이도 데이터 경합이 사라진다"
      ],
      "answer": 1,
      "explanation": "코히런스는 각 메모리 위치별로 쓰기들에 대한 단일 순서가 있고 모든 스레드가 그것과 모순되지 않게 관측함을 뜻합니다. 위치들 사이의 순서는 일관성 모델의 몫입니다."
    },
    {
      "type": "ox",
      "prompt": "happens-before는 각 스레드 내부의 프로그램 순서와 스레드 간 동기화 순서를 합쳐 이행적으로 닫은 관계로 정의된다.",
      "answer": true,
      "explanation": "같은 스레드 안의 순서(sequenced-before)와 synchronizes-with를 합성하고 이행 폐포를 취한 것이 happens-before입니다. 그래서 A→B, B→C이면 A→C가 성립합니다."
    },
    {
      "type": "ox",
      "prompt": "Java에서 필드를 volatile로 선언하면 그 필드에 대한 i++ 같은 증가 연산도 원자적으로 수행된다.",
      "answer": false,
      "explanation": "volatile은 가시성과 순서를 보장할 뿐, 읽기·수정·쓰기(RMW) 복합 연산의 원자성은 주지 않습니다. 원자적 증가는 락이나 원자적 CAS 연산이 필요합니다."
    },
    {
      "type": "ox",
      "prompt": "Java 메모리 모델은 데이터 경합이 있는 프로그램에도 (약하지만) 정의된 의미를 부여하며, 타입·메모리 안전성은 유지된다.",
      "answer": true,
      "explanation": "JMM은 샌드박스 보안 때문에 경합 프로그램조차 미정의 동작으로 두지 않고 허용 결과 집합을 정의합니다. 반면 C++은 데이터 경합을 미정의 동작으로 규정합니다."
    },
    {
      "type": "text",
      "prompt": "'모든 실행이 어떤 하나의 순차적 인터리빙과 같아야 한다'고 요구하는 가장 강한 일관성 모델의 이름은?",
      "answers": [
        "순차 일관성",
        "순차일관성",
        "sequential consistency",
        "SC"
      ],
      "explanation": "순차 일관성(sequential consistency, SC)입니다. 가장 직관적이지만 하드웨어·컴파일러 최적화를 크게 제약합니다."
    },
    {
      "type": "ox",
      "prompt": "C++ 표준에서 두 원자적(atomic) 접근끼리 동시에 일어나는 것은 데이터 경합으로 규정되지 않는다.",
      "answer": true,
      "explanation": "데이터 경합의 정의는 '충돌하는 두 접근 중 적어도 하나가 비원자적(non-atomic)이고 happens-before로 순서지어지지 않을 것'입니다. 원자 연산끼리의 경쟁은 경합이 아니라 정의된 동작입니다."
    },
    {
      "type": "ox",
      "prompt": "relaxed 순서(memory_order_relaxed)로 지정한 원자 연산은 원자성마저 포기한다.",
      "answer": false,
      "explanation": "relaxed도 해당 연산 자체의 원자성과 위치별 modification order는 유지합니다. 포기하는 것은 다른 위치 접근과의 순서·동기화 보장뿐입니다."
    },
    {
      "type": "choice",
      "prompt": "release 저장과 acquire 적재에 대한 설명으로 옳은 것은?",
      "choices": [
        "두 연산 사이에는 어떤 순서 관계도 만들어지지 않는다",
        "acquire 적재 뒤의 연산은 자유롭게 그 앞으로 재배열될 수 있다",
        "acquire 적재가 그 release 저장이 쓴 값을 읽으면 둘 사이에 synchronizes-with가 성립한다",
        "release 저장은 그 이후에 오는 연산들까지 앞으로 끌어온다"
      ],
      "answer": 3,
      "explanation": "acquire 적재가 그 release 저장이 쓴 값을 읽을 때 synchronizes-with가 성립하고, 이를 통해 release 이전의 쓰기들이 acquire 이후 코드에 보이게 됩니다."
    },
    {
      "type": "ox",
      "prompt": "seq_cst 원자 연산들에는 모든 스레드가 동의하는 하나의 전역 전순서가 존재한다.",
      "answer": true,
      "explanation": "가장 강한 순서인 seq_cst는 해당 연산 전체에 단일 전순서 S가 있음을 요구하며, 이 전순서가 스레드별 프로그램 순서와도 일관되어야 합니다."
    },
    {
      "type": "ox",
      "prompt": "acquire/release만 사용하면 결과는 항상 seq_cst를 쓴 것과 동일하다.",
      "answer": false,
      "explanation": "acquire/release는 짝지어진 두 스레드 사이의 순서만 만들 뿐 전역 전순서를 주지 않습니다. IRIW처럼 서로 다른 관찰자가 두 쓰기의 순서를 다르게 볼 수 있는 실행이 허용됩니다."
    },
    {
      "type": "ox",
      "prompt": "TSO(total store order) 계열 모델에서는 저장 버퍼 때문에 생기는 저장→적재 재배열이 관측되지 않는다.",
      "answer": false,
      "explanation": "TSO는 저장 버퍼를 허용하므로, 각자 쓰고 상대를 읽는 고전적 예제에서 두 스레드가 모두 옛 값을 읽는 비-SC 실행이 나올 수 있습니다. 이를 막으려면 장벽이 필요합니다."
    },
    {
      "type": "text",
      "prompt": "컴파일러와 하드웨어의 메모리 접근 재배열을 국소적으로 제한하기 위해 삽입하는 명령의 총칭은?",
      "answers": [
        "메모리 배리어",
        "메모리배리어",
        "메모리 장벽",
        "memory barrier",
        "fence",
        "메모리 펜스",
        "barrier"
      ],
      "explanation": "메모리 배리어(memory barrier) 또는 펜스(fence)라고 부릅니다. 순서를 강제하는 대가로 성능 비용이 발생합니다."
    },
    {
      "type": "ox",
      "prompt": "happens-before는 이행적이어서 A가 B에, B가 C에 선행하면 A는 C에도 선행한다.",
      "answer": true,
      "explanation": "happens-before는 이행 폐포로 정의된 부분순서이므로 이행성이 성립합니다. 덕분에 동기화가 사슬처럼 이어지면 가시성도 함께 전파됩니다."
    },
    {
      "type": "choice",
      "prompt": "뮤텍스(락)가 메모리 모델에서 제공하는 순서 보장은 무엇인가?",
      "choices": [
        "락을 잡은 스레드의 모든 연산이 실제 시간상 다른 스레드보다 먼저 실행된다",
        "같은 락의 해제(unlock)는 그 뒤 그 락의 획득(lock)에 happens-before로 선행한다",
        "락은 상호 배제만 제공하고 가시성과는 무관하다",
        "서로 다른 락들 사이에도 전역 전순서가 보장된다"
      ],
      "answer": 2,
      "explanation": "같은 락에 대한 unlock은 이후의 lock에 happens-before로 선행합니다. 그래서 임계 구역 안의 쓰기가 다음에 락을 잡는 스레드에게 보입니다."
    },
    {
      "type": "ox",
      "prompt": "두 사건이 happens-before로 순서지어졌다는 것은 실제 물리적 시각(wall clock)상 먼저 실행되었음을 뜻한다.",
      "answer": false,
      "explanation": "happens-before는 물리적 시간이 아니라 '보장되는 인과·가시성 순서'를 나타내는 논리적 부분순서입니다. 반대로 시간상 먼저 일어난 두 사건이 happens-before로 순서지어지지 않을 수도 있습니다."
    },
    {
      "type": "ox",
      "prompt": "두 접근이 서로 다른 메모리 위치를 향한다면, 동기화가 없어도 데이터 경합이 아니다.",
      "answer": true,
      "explanation": "경합의 전제인 '충돌(conflict)'은 같은 메모리 위치에 대한 접근이면서 적어도 하나가 쓰기일 때만 성립합니다. 위치가 다르면 충돌 자체가 없습니다."
    },
    {
      "type": "ox",
      "prompt": "데이터 경합이 있는 프로그램은 실행할 때마다 반드시 눈에 띄게 잘못된 결과를 낸다.",
      "answer": false,
      "explanation": "경합은 특정 인터리빙·하드웨어·최적화 조건에서만 드러나는 경우가 많아 오랫동안 정상처럼 보일 수 있습니다. 그래서 테스트가 아니라 정적·동적 경합 탐지와 올바른 동기화가 필요합니다."
    },
    {
      "type": "choice",
      "prompt": "완화된 메모리 모델의 'out-of-thin-air(OOTA)' 문제란 무엇인가?",
      "choices": [
        "원자적 연산이 원자성을 잃어버리는 현상",
        "컴파일러가 락을 제거해 버리는 최적화",
        "캐시 미스 때문에 값이 늦게 보이는 현상",
        "인과 순환 탓에 어디에서도 쓰이지 않은 값이 나타나는 실행을 배제하기 어려운 문제"
      ],
      "answer": 4,
      "explanation": "relaxed 원자 연산의 인과 순환 때문에 어떤 쓰기에서도 유래하지 않은 값이 나타나는 실행을, 다른 최적화를 막지 않으면서 형식적으로 배제하기 어려운 문제입니다. 완화된 모델 형식화의 대표적 난제입니다."
    },
    {
      "type": "ox",
      "prompt": "원자적 읽기-수정-쓰기(CAS 등) 연산은 해당 위치의 modification order에서 자기 바로 앞 값을 읽는다.",
      "answer": true,
      "explanation": "RMW는 수정 순서상 직전 값을 읽도록 규정되어 있어, 두 RMW가 같은 값을 읽고 둘 다 성공하는 일이 없습니다. 이 성질이 락프리 알고리즘의 정확성 근거입니다."
    },
    {
      "type": "ox",
      "prompt": "공유 변수를 모두 원자적(atomic)으로 선언하면 상호 배제가 필요한 문제까지 저절로 해결된다.",
      "answer": false,
      "explanation": "원자 변수는 개별 연산의 원자성과 순서를 줄 뿐, 여러 변수에 걸친 불변식을 한꺼번에 유지해 주지는 않습니다. 복합 불변식에는 여전히 락이나 트랜잭션적 구조가 필요합니다."
    },
    {
      "type": "ox",
      "prompt": "메모리 모델은 하드웨어뿐 아니라 컴파일러의 최적화(재배열·중복 제거 등)도 함께 제약한다.",
      "answer": true,
      "explanation": "언어 수준 메모리 모델은 '소스 프로그램의 허용 관측 결과'를 규정하므로, 그 결과를 넘어서는 컴파일러 변환은 불법이 됩니다. 그래서 메모리 모델은 컴파일러와 하드웨어 사이의 계약 역할을 합니다."
    },
    {
      "type": "ox",
      "prompt": "메모리 모델이 완화될수록 하드웨어·컴파일러의 최적화 여지는 넓어지지만 프로그램에 대한 추론은 어려워진다.",
      "answer": true,
      "explanation": "허용 실행 집합이 커지므로 구현의 자유도는 늘고 프로그래머가 배제해야 할 경우의 수도 늡니다. SC-DRF 보장은 '동기화만 제대로 하면 SC로 추론해도 된다'는 타협점을 제공합니다."
    }
  ]
}
