5. 컨텍스트 스위칭, 캐시, false sharing

난이도 중 해설 보기 →
문제

문제 5 — 컨텍스트 스위칭, 캐시, false sharing

면접 질문

  1. 컨텍스트 스위칭(context switch) 이 일어나면 CPU 내부에서 무슨 일이 벌어지는가? 직접 비용과 간접 비용을 나눠 설명하라.

  2. 캐시 라인(cache line) 이 무엇인지, CPU가 메모리를 바이트가 아니라 라인 단위로 다루는 이유를 설명하라. 캐시 일관성 프로토콜(MESI 등)이 멀티코어에서 하는 일은?

  3. false sharing(거짓 공유) 이란 무엇인가? 왜 "서로 다른 변수를 다른 스레드가 건드리는데도" 성능이 무너지는가? 어떻게 진단하고 고치는가?

응용 시나리오

게임서버의 통계 수집기를 만들었다. 워커 스레드가 8개이고, 각 워커는 자기 인덱스의 카운터만 증가시킨다(락도 없고 공유 변수도 안 건드리는데 빠를 거라 기대).

struct Stats {
    long long packetCount[8];   // 워커 i는 packetCount[i]만 증가
};
Stats g_stats;

// 워커 i (i = 0..7), 초당 수십만 번 호출
void onPacket(int i) {
    g_stats.packetCount[i]++;   // 자기 칸만 ++
}

벤치마크해 보니, 같은 카운터를 8개 스레드가 각각 독립된 캐시 라인에 두고 증가시킨 버전보다 이 코드가 몇 배 느리다. 심지어 스레드를 늘릴수록 더 느려지기도 한다.

  • 락도 없고 각자 다른 배열 칸을 쓰는데 왜 느린가? 어떤 하드웨어 동작이 원인인가?
  • 이 구조체에서 정확히 무엇이 문제이며, 코드를 어떻게 고치겠는가? (메모리 레이아웃 관점)
  • 고친 뒤에도 최종 합산이 필요하다. 합산은 어느 시점에 어떻게 하는 게 좋은가?
답안 작성
내 답안 · 자동 저장

직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.