CS Fundamentals
데드락(Deadlock)에 대해서 설명해주세요
데드락이 발생하는 4가지 조건부터 예방·회피·탐지·복구 전략까지 — 자원 할당 그래프와 인터랙티브 시뮬레이션으로 완전히 이해합니다.
2026년 3월 15일 · 약 14분 읽기
Q. "데드락이 무엇인지 설명하고, 발생 조건과 해결 전략에 대해 말씀해주세요."
예상 꼬리질문
답변 가이드
"데드락은 두 개 이상의 프로세스가 서로가 보유한 자원을 기다리며 영원히 진행할 수 없는 상태입니다."
"데드락은 상호 배제·점유 대기·비선점·순환 대기 4가지 조건이 동시에 성립할 때만 발생합니다. 하나라도 깨지면 데드락은 일어나지 않습니다."
"처리 전략은 예방(Prevention), 회피(Avoidance), 탐지(Detection), 무시(Ignorance) 4가지이며, 실무에서는 Lock Ordering으로 순환 대기를 원천 차단하는 방식이 가장 간단하고 효과적입니다."
서버가 갑자기 멈췄는데 CPU도 0%, 에러 로그도 없다면? 범인은 데드락일 가능성이 높습니다. 두 스레드가 서로의 자원을 기다리며 영원히 잠들어버린 상태입니다.
발생 조건부터 실무 해결책까지 — 각 개념을 직접 만져볼 수 있는 시각화로 체험합니다.
1. 데드락이란 무엇인가 — 4가지 발생 조건
꼬리질문: "데드락이 발생하는 4가지 조건이 뭔가요?"
데드락은 두 개 이상의 프로세스(또는 스레드)가 서로가 보유한 자원을 기다리며 영원히 진행할 수 없는 상태입니다. 1971년 Coffman이 정의한 4가지 조건이 동시에 성립할 때만 데드락이 발생합니다.
하나라도 깨지면 데드락은 일어나지 않습니다. 아래 카드를 클릭하여 각 조건의 의미와 예방법을 확인해 보세요.
4가지 조건이 동시에 성립해야 데드락 발생
정의
자원은 한 번에 하나의 프로세스만 사용 가능합니다.
예방법
읽기 전용 자원은 공유 허용 (예: 읽기 락)
예시
프린터, 파일 쓰기 권한, 뮤텍스(Mutex)
하나의 조건만 제거해도 데드락은 발생하지 않습니다
2. 자원 할당 그래프 — 데드락을 눈으로 보다
꼬리질문: "자원 할당 그래프로 데드락을 어떻게 감지하나요?"
자원 할당 그래프(Resource Allocation Graph, RAG)는 프로세스와 자원 간의 의존 관계를 시각화하는 도구입니다. 그래프에 사이클이 존재하면 데드락이 발생했거나 발생 가능한 상태입니다.
두 시나리오를 전환하며 사이클이 형성되는 순간 데드락이 감지되는 과정을 체험해 보세요.
자원이 다중 인스턴스를 가질 때는 사이클이 있어도 데드락이 아닐 수 있습니다.
현재 상태
P1이 R1을 보유하고 R2를 요청 중, P2가 R2를 보유 중
분석
사이클 없음 — P2가 R2를 해제하면 P1이 진행 가능
범례
3. 데드락 처리 전략 — 예방·회피·탐지·무시
꼬리질문: "데드락 예방, 회피, 탐지의 차이가 뭔가요?"
예방(Prevention)은 설계 단계에서 4조건 중 하나를 원천 제거하고, 회피(Avoidance)는 요청마다 안전 상태를 검사합니다.
탐지(Detection)는 발생 후 복구하고, 무시(Ignorance)는 발생 빈도가 낮다고 판단해 처리하지 않습니다. 각 전략의 트레이드오프를 탭으로 비교해 보세요.
설계 단계에서 Coffman 4조건 중 하나를 원천 제거합니다.
실제 사용 예시
4. Banker's Algorithm — 안전 상태란 무엇인가
꼬리질문: "Banker's Algorithm이 무엇인지 설명해주세요"
은행가 알고리즘(Banker's Algorithm)은 Dijkstra가 1965년 고안한 대표적인 데드락 회피 알고리즘입니다. OS가 자원 요청을 받을 때 "이 요청을 허용해도 모든 프로세스가 결국 완료될 수 있는가"를 시뮬레이션합니다.
안전 상태(Safe State)란 현재 할당 상태에서 모든 프로세스가 순서대로 완료될 수 있는 안전 순열(Safe Sequence)이 하나라도 존재하는 상태입니다.
아래에서 탐색 과정을 직접 확인해 보세요.
| 프로세스 | Max (A,B,C) | 할당 (A,B,C) | 필요 (A,B,C) | 상태 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| P0 | 7 | 5 | 3 | 0 | 1 | 0 | 7 | 4 | 3 | 대기 |
| P1 | 3 | 2 | 2 | 2 | 0 | 0 | 1 | 2 | 2 | 대기 |
| P2 | 9 | 0 | 2 | 3 | 0 | 2 | 6 | 0 | 0 | 대기 |
| P3 | 2 | 2 | 2 | 2 | 1 | 1 | 0 | 1 | 1 | 대기 |
| P4 | 4 | 3 | 3 | 0 | 0 | 2 | 4 | 3 | 1 | 대기 |
안전 순열 탐색
5. 코드로 보는 데드락 — 발생과 해결
꼬리질문: "실무 코드에서 데드락을 어떻게 예방하나요?"
실제 멀티스레드 코드에서 데드락은 주로 두 스레드가 서로 다른 순서로 락을 획득할 때 발생합니다. 가장 간단하고 효과적인 해결책은 Lock Ordering — 항상 동일한 순서로 락을 획득하는 것입니다.
tryLock()을 사용하면 락 획득 실패 시 바로 포기하고 재시도하는 방식으로도 회피할 수 있습니다.
세 가지 시나리오를 탭으로 비교해 보세요.
Thread 1
Thread 2
6. 데이터베이스 데드락 — MySQL은 어떻게 해결하나
꼬리질문: "데이터베이스에서 데드락은 어떻게 해결하나요?"
데이터베이스에서도 데드락은 자주 발생합니다. 두 트랜잭션이 서로 상대방이 잠근 행(row lock)을 기다리는 상황입니다. MySQL InnoDB는 Wait-for Graph를 주기적으로 검사하여 사이클을 탐지하고, 비용이 적은 트랜잭션을 자동으로 희생자(victim)로 선택해 롤백합니다.
애플리케이션 레벨에서는 항상 동일한 순서로 테이블/행에 접근하거나, 트랜잭션을 짧게 유지하거나, SELECT ... FOR UPDATE로 선제적 잠금을 거는 방식으로 예방할 수 있습니다.
면접 체크리스트
이 항목들을 자신 있게 설명할 수 있다면 데드락 질문은 준비 완료입니다.
- - 데드락 4조건: 상호 배제·점유 대기·비선점·순환 대기가 동시에 성립해야 발생
- - 자원 할당 그래프: 사이클 = 데드락 가능성, 단일 인스턴스에서는 사이클 = 데드락 확정
- - 처리 전략: 예방(설계로 조건 제거) → 회피(Banker's) → 탐지(DB) → 무시(범용 OS)
- - 실무 핵심: Lock Ordering으로 순환 대기를 원천 차단, 트랜잭션은 짧게 유지
- - 더 알아볼 주제: 라이브락(Livelock)과 기아(Starvation), 분산 데드락
참고 자료
- Baeldung - Deadlock and Livelock in Java — Java 코드로 데드락·라이브락을 직접 재현하고 해결하는 실습 중심의 튜토리얼
- NAVER D2 - Java 스레드 동기화 — Java 동기화 메커니즘을 깊이 있게 다루는 한국어 기술 블로그
의견을 들려주세요
서비스 개선에 큰 도움이 됩니다. 익명으로 자유롭게 남겨주세요.