18. 뮤텍스는 어떻게 구현되나: futex·사용자공간 스핀·커널 대기·adaptive mutex

난이도 상 해설 보기 →
문제

문제 18 — 뮤텍스는 어떻게 구현되나: futex·사용자공간 스핀·커널 대기·adaptive mutex

게임 서버의 틱 루프와 워커 스레드는 초당 수십만 번 락을 잡고 푼다. "뮤텍스를 잠근다"는 한 줄이 실제로 하드웨어·커널 수준에서 어떻게 동작하는지 이해하면, 경합 상황의 성능과 스핀락과의 경계를 설계할 수 있다.

다음을 설명하라.

  1. 무경합 경로(fast path): 경합이 없을 때 뮤텍스 lock/unlock 이 커널로 들어가지 않고 사용자 공간의 원자적 연산(CAS)만으로 끝나는 과정을 설명하라. 왜 무경합 락이 "거의 공짜"에 가까운가?

  2. 경합 경로(slow path)와 futex: 이미 잠긴 뮤텍스를 다른 스레드가 잡으려 할 때 어떤 일이 일어나는가? Linux의 futex(fast userspace mutex)가 "경합이 있을 때만 커널로 내려가 대기/깨우기"를 어떻게 구현하는지(대기 큐, FUTEX_WAIT/FUTEX_WAKE) 설명하라.

  3. 스핀 vs 블록, 그리고 adaptive mutex: 락을 얻지 못했을 때 즉시 커널에서 재우는 것과 잠깐 사용자 공간에서 스핀하는 것의 트레이드오프는 무엇인가? "짧게 스핀하다 안 되면 블록"하는 adaptive mutex가 어떤 상황에서 유리한가?

  4. 스핀락과의 경계: 순수 스핀락(항상 바쁜 대기)은 언제 뮤텍스보다 낫고 언제 재앙이 되는가? 임계 구역 길이, 코어 수, 선점(preemption), 우선순위 역전 관점에서 논하라.

  5. 게임 서버 적용: 매우 짧은 임계 구역(카운터 증가, 큐 push)과 긴 임계 구역(DB 콜백, 직렬화)에서 각각 어떤 동기화(원자적 연산/스핀락/뮤텍스/락프리)를 고르겠는가? 근거를 대라.

답안 작성
내 답안 · 자동 저장

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