2. 데드락: 4조건, 예방/회피, 락 순서와 경합 줄이기

난이도 중 해설 보기 →
문제

문제 2 — 데드락: 4조건, 예방/회피, 락 순서와 경합 줄이기

면접 질문

  1. 데드락(deadlock)이 발생하는 4가지 필요조건(Coffman 조건) 을 모두 말하고 각각 한 줄로 설명하라.

  2. 데드락을 막는 전략으로 예방(prevention)회피(avoidance) 가 있다. 둘의 차이는 무엇이며, 실무 서버에서 가장 흔히 쓰는 방법은?

  3. 락 경합(lock contention) 이 심하면 데드락이 없어도 성능이 무너진다. 경합을 줄이는 방법 3가지를 말하라.

응용 시나리오

거래(trade) 기능에서 두 플레이어가 서로의 인벤토리에 접근한다.

void Trade(Player a, Player b)
{
    lock (a.InventoryLock)
    {
        lock (b.InventoryLock)
        {
            // a, b 인벤토리 사이에서 아이템 교환
            MoveItems(a, b);
        }
    }
}

QA에서 가끔 서버가 통째로 멈춘다. 로그를 보면 두 스레드가 각각 Trade(P1, P2)Trade(P2, P1) 을 동시에 실행하던 중이었다.

  • 왜 멈추는가? Coffman 4조건이 이 코드에서 각각 어떻게 충족되는지 짚어라.
  • 코드를 최소 변경으로 안전하게 만들려면 어떻게 하겠는가? (락 두 개를 모두 유지한다는 전제)
  • 만약 거래뿐 아니라 우편, 길드창고 등 여러 시스템이 인벤토리 락을 잡는다면, 데드락을 구조적으로 막기 위해 팀 차원에서 어떤 규칙을 세우겠는가?
답안 작성
내 답안 · 자동 저장

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