5. 컨텍스트 스위칭, 캐시, false sharing
난이도 중 해설 보기 →
문제
문제 5 — 컨텍스트 스위칭, 캐시, false sharing
면접 질문
-
컨텍스트 스위칭(context switch) 이 일어나면 CPU 내부에서 무슨 일이 벌어지는가? 직접 비용과 간접 비용을 나눠 설명하라.
-
캐시 라인(cache line) 이 무엇인지, CPU가 메모리를 바이트가 아니라 라인 단위로 다루는 이유를 설명하라. 캐시 일관성 프로토콜(MESI 등)이 멀티코어에서 하는 일은?
-
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개 스레드가 각각 독립된 캐시 라인에 두고 증가시킨 버전보다 이 코드가 몇 배 느리다. 심지어 스레드를 늘릴수록 더 느려지기도 한다.
- 락도 없고 각자 다른 배열 칸을 쓰는데 왜 느린가? 어떤 하드웨어 동작이 원인인가?
- 이 구조체에서 정확히 무엇이 문제이며, 코드를 어떻게 고치겠는가? (메모리 레이아웃 관점)
- 고친 뒤에도 최종 합산이 필요하다. 합산은 어느 시점에 어떻게 하는 게 좋은가?
답안 작성
내 답안 · 자동 저장
직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.