교착상태를 피하고 복구하는 자원 관리 전략
교착상태의 성립 조건과 예방·회피·발견·회복 방식, Wait-Die와 Wound-Wait, 데이터베이스 잠금 충돌 대응을 정리한다.
2026-08-14 · 최초 발행 2025-08-10
자원을 잡은 채 서로를 기다릴 때
교착상태(Deadlock)는 다중 프로그래밍 환경에서 둘 이상의 프로세스가 상대 작업의 종료를 끝없이 기다리는 상태다. 자원이 묶인 채 작업이 진전되지 않으므로, 자원 활용과 시스템 성능 모두에 영향을 준다.
교착상태는 아래 조건이 동시에 충족될 때 성립한다.
- 상호 배제(Mutual Exclusion): 하나의 자원은 한 번에 하나의 프로세스만 사용할 수 있다.
- 점유와 대기(Hold and Wait): 프로세스가 자원을 보유한 상태에서 다른 자원을 요청하고 기다린다.
- 비선점(No Preemption): 이미 할당된 자원을 다른 프로세스가 강제로 가져갈 수 없다.
- 환형 대기(Circular Wait): 프로세스들이 원을 이루며 서로가 보유한 자원을 요청한다.
발생 전 차단하거나, 발생 뒤 복구하는 방법
교착상태를 다루는 방식은 예방, 회피, 발견, 회복으로 나뉜다. 어느 방식을 택할지는 자원 할당을 얼마나 엄격히 통제할 수 있는지와 장애 발생 후 복구 비용에 따라 달라진다.
예방으로 필요조건을 끊기
예방은 교착상태의 필요조건 가운데 하나 이상이 성립하지 않게 만드는 방식이다.
- 상호 배제를 부정하려면 모든 자원을 공유 가능하게 만들어야 하지만, 현실적으로 불가능한 자원이 많다.
- 점유와 대기를 막으려면 실행 전에 필요한 자원을 모두 할당받게 하거나, 아무 자원도 점유하지 않은 상태에서만 새 자원을 요청하게 한다.
- 비선점을 부정하는 방식에서는 다른 자원을 요청한 프로세스가 대기해야 하면 보유 자원을 반납한다.
- 환형 대기는 자원 유형에 번호를 부여하고, 프로세스가 오름차순으로만 요청하도록 제한해 차단할 수 있다.
안전 상태를 확인하는 회피
회피는 자원 요청에 관한 추가 정보를 바탕으로, 교착상태 가능성이 있는 할당을 거부하는 방법이다. 다익스트라가 제안한 은행가 알고리즘(Banker's Algorithm)은 자원을 할당한 뒤에도 안전 상태(Safe State)를 유지할 수 있을 때만 요청을 허용한다.
이때 타임스탬프로 프로세스의 우선순위를 정하는 Wait-Die와 Wound-Wait도 사용할 수 있다. Wait-Die에서는 오래된 프로세스(Old)가 젊은 프로세스(Young)의 자원을 요청하면 대기(Wait)한다. 반대로 젊은 프로세스가 오래된 프로세스의 자원을 요청하면 작업을 취소하고 재시작(Die)한다.
Wound-Wait는 반대 방향으로 작동한다. 오래된 프로세스가 젊은 프로세스의 자원을 요청하면 젊은 프로세스를 중단시키고(Wound) 자원을 선점한다. 젊은 프로세스가 오래된 프로세스의 자원을 요청한 경우에는 대기(Wait)한다.
순환을 찾아내는 발견
발견 방식은 교착상태 발생 여부를 주기적으로 검사한다. 자원 할당 그래프를 대상으로 감지 알고리즘을 수행해 순환 관계를 확인한다.
감지 후에는 종료 또는 선점
교착상태가 확인되면 관련 프로세스 하나 또는 모두를 종료할 수 있다. 다른 선택지는 교착상태에 있는 프로세스로부터 자원을 강제로 회수해 다른 프로세스에 할당하는 자원 선점이다.
타임스탬프로 충돌을 처리하는 방식
Wait-Die와 Wound-Wait는 모두 타임스탬프를 이용해 프로세스 간 우선순위를 정한다. 다만 오래된 프로세스와 젊은 프로세스가 충돌했을 때 대기와 선점을 적용하는 방향이 다르다.
| 방식 | 오래된 프로세스 | 젊은 프로세스 |
|---|---|---|
| Wait-Die | 대기(Wait) | 포기 후 재시작(Die) |
| Wound-Wait | 자원 선점(Wound) | 대기(Wait) |
데이터베이스 잠금이 맞물리는 상황
데이터베이스에서 트랜잭션을 처리하는 동안 생긴 교착상태는 비즈니스 운영에 심각한 영향을 줄 수 있다. 두 사용자가 동시에 은행 계좌 정보를 갱신하는 경우를 생각해 볼 수 있다.
이런 잠금 충돌에는 일정 시간 이상 기다린 트랜잭션을 롤백하는 타임아웃을 설정할 수 있다. 잠금 획득 순서를 고정하는 락 계층 구조도 대안이다. 2단계 락킹(2PL)은 모든 잠금을 획득한 뒤에만 해제를 시작하는 방식이다.
기아상태와 구분해야 하는 이유
기아상태(Starvation)는 특정 프로세스가 필요한 자원을 계속 할당받지 못하는 상태다. 교착상태처럼 작업이 멈춰 보일 수 있지만, 원인과 영향 범위가 다르다.
| 특성 | 교착상태(Deadlock) | 기아상태(Starvation) |
|---|---|---|
| 정의 | 둘 이상의 프로세스가 서로의 자원을 무한정 기다리는 상황 | 특정 프로세스가 필요한 자원을 계속 할당받지 못하는 상황 |
| 원인 | 자원의 상호 점유와 순환 대기 | 자원 할당의 불공정성, 우선순위 체계 |
| 해결 방법 | 예방, 회피, 발견, 회복 | 에이징(Aging), 공정한 자원 할당 정책 |
| 시스템 영향 | 관련 프로세스들이 모두 진행 불가 | 특정 프로세스만 진행 불가 |
운영체제와 데이터베이스 시스템에서는 자원 할당 정책을 설계할 때 교착상태 가능성을 함께 다뤄야 한다. 완전한 예방은 오버헤드가 클 수 있으므로, 응용 환경에 맞춰 회피와 감지 메커니즘을 조합하고 안정성과 성능을 고려해 관리 정책을 선택해야 한다.