교착 상태(Deadlock)란 둘 이상의 프로세스(또는 스레드)가 서로가 가진 자원을 기다리며 무한히 대기하는 상태를 의미한다.
이 상태에 빠지면 아무 작업도 진행되지 않으며, 외부 개입 없이는 복구가 어렵다.
🔹 교착 상태가 발생하는 조건 (Coffman의 4가지 조건)
교착 상태는 다음 네 가지 조건이 동시에 만족될 때 발생한다.
-
상호 배제 (Mutual Exclusion)
- 자원은 한 번에 한 프로세스만 사용할 수 있어야 한다.
-
점유 대기 (Hold and Wait)
- 자원을 가진 상태에서 다른 자원을 기다리는 프로세스가 존재해야 한다.
-
비선점 (No Preemption)
- 다른 프로세스가 점유한 자원을 강제로 뺏을 수 없어야 한다.
-
순환 대기 (Circular Wait)
- 프로세스들이 자원을 서로 물고 물며 원형으로 기다리는 상태여야 한다.
예: P1 → P2 → P3 → P1
💡 예시
두 개의 프로세스와 두 개의 자원이 있을 때:
- P1은 자원 A를 점유한 상태에서 자원 B를 요청하고,
- P2는 자원 B를 점유한 상태에서 자원 A를 요청하면,
- 서로 상대방이 자원을 놓을 때까지 무한 대기하게 된다.
P1: 자원 A [획득] → 자원 B [대기]
P2: 자원 B [획득] → 자원 A [대기]
→ 교착 상태 발생
🔧 교착 상태 해결 및 예방 방법
1. 교착 상태 예방 (Deadlock Prevention)
- 위 네 조건 중 하나 이상이 성립하지 않도록 설계
- 예: 모든 자원을 한 번에 할당하도록 강제 → 점유 대기 조건 제거
2. 교착 상태 회피 (Deadlock Avoidance)
- 자원 할당 전, 안전 상태인지 시뮬레이션 후 허용
- 대표 알고리즘: 은행원 알고리즘(Banker's Algorithm)
3. 교착 상태 탐지 및 회복 (Detection & Recovery)
- 주기적으로 교착 상태를 탐지하고,
- 발생 시 강제로 자원 회수 또는 프로세스 종료
4. 타임아웃 설정
- 일정 시간 동안 자원을 획득하지 못하면 대기 중단
- 간단하고 실용적인 해결책
✅ 정리
- 교착 상태는 프로세스들이 서로 자원을 점유한 채 기다리는 막힘 상태를 뜻한다.
- 발생 조건은 상호 배제, 점유 대기, 비선점, 순환 대기의 네 가지가 동시에 충족될 때이다.
- 예방, 회피, 탐지 및 복구 전략을 통해 적절히 대응해야 한다.