17. 생산자-소비자 큐 설계: SPSC/MPMC, 링버퍼, 블로킹 vs 논블로킹, 백프레셔

난이도 중 해설 보기 →
문제

문제 17 — 생산자-소비자 큐 설계: SPSC/MPMC, 링버퍼, 블로킹 vs 논블로킹, 백프레셔

게임 서버의 심장부에는 거의 항상 "한 쪽이 만들고 다른 쪽이 소비하는" 큐가 있다: 네트워크 수신 스레드 → 로직 스레드, 로직 → DB 쓰기 스레드, 이벤트 버스 등. 생산자-소비자 큐의 설계 선택지와 트레이드오프를 묻는다.

다음을 설명하라.

  1. 생산자/소비자 수에 따른 분류: SPSC, SPMC, MPSC, MPMC 는 각각 무엇이고, 왜 SPSC 가 가장 빠르고 단순하게(락 없이) 구현되는가? 게임 서버의 어떤 경로가 각 유형에 해당하는지 예를 들라.

  2. 바운드 링버퍼 vs 무제한 연결 리스트 큐: 고정 크기 링버퍼(ring buffer)와 무제한 큐의 장단점은? 링버퍼가 캐시 지역성과 할당 측면에서 유리한 이유, 그리고 "가득 참"을 어떻게 다루는가?

  3. 블로킹 vs 논블로킹: 소비자가 빌 때/생산자가 찰 때, (a) 조건 변수로 블로킹 대기, (b) 스핀/양보, (c) 즉시 실패(try_push/try_pop) 세 방식의 트레이드오프(지연, CPU, 처리량)를 비교하라.

  4. 백프레셔(backpressure): 생산자가 소비자보다 지속적으로 빠를 때 무제한 큐가 왜 위험한가? 백프레셔를 거는 방법(블로킹, 거절/드롭, 샘플링, 생산 속도 조절)과 게임에서의 선택 기준(예: 입력 큐 vs 로그 큐)을 논하라.

  5. 거짓 공유와 배치: MPMC 링버퍼에서 head/tail 인덱스를 어떻게 배치해야 거짓 공유(false sharing)를 피하는가? 소비자가 여러 항목을 한꺼번에 꺼내는 배치(batching)가 처리량에 주는 영향은?

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

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