2. 데드락: 4조건, 예방/회피, 락 순서와 경합 줄이기
난이도 중 해설 보기 →
문제
문제 2 — 데드락: 4조건, 예방/회피, 락 순서와 경합 줄이기
면접 질문
-
데드락(deadlock)이 발생하는 4가지 필요조건(Coffman 조건) 을 모두 말하고 각각 한 줄로 설명하라.
-
데드락을 막는 전략으로 예방(prevention) 과 회피(avoidance) 가 있다. 둘의 차이는 무엇이며, 실무 서버에서 가장 흔히 쓰는 방법은?
-
락 경합(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조건이 이 코드에서 각각 어떻게 충족되는지 짚어라.
- 코드를 최소 변경으로 안전하게 만들려면 어떻게 하겠는가? (락 두 개를 모두 유지한다는 전제)
- 만약 거래뿐 아니라 우편, 길드창고 등 여러 시스템이 인벤토리 락을 잡는다면, 데드락을 구조적으로 막기 위해 팀 차원에서 어떤 규칙을 세우겠는가?
답안 작성
내 답안 · 자동 저장
직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.