데드락(Deadlock)이란? 발생 조건과 해결 방법 정리

데드락이란 무엇인가

데드락(Deadlock)은 두 개 이상의 프로세스나 스레드가 서로 상대방이 점유한 자원을 기다리며 무한정 멈춰버리는 상태를 말합니다. 흔히 드는 비유가 좁은 교차로 상황입니다. 네 방향에서 동시에 진입한 자동차들이 서로 양보하지 않고 앞차만 바라보며 멈춰 있다면, 누군가 먼저 물러나지 않는 한 영원히 그 자리에서 움직일 수 없습니다. 데드락도 마찬가지로 프로그램이 스스로는 절대 빠져나올 수 없는 교착 상태입니다. 데이터베이스 트랜잭션, 멀티스레드 프로그래밍, 운영체제 자원 관리 등에서 흔히 발생하며, 서비스가 특정 요청에서 계속 응답하지 않는 형태로 나타나는 경우가 많습니다.

데드락 발생의 4가지 조건

데드락은 아래 네 가지 조건이 동시에 성립할 때만 발생합니다. 하나라도 깨지면 데드락은 일어나지 않습니다.

  • 상호 배제(Mutual Exclusion): 자원을 한 번에 하나의 프로세스만 사용할 수 있음
  • 점유와 대기(Hold and Wait): 자원을 가진 채로 다른 자원을 추가로 기다림
  • 비선점(No Preemption): 다른 프로세스가 강제로 자원을 빼앗을 수 없음
  • 순환 대기(Circular Wait): 프로세스들이 서로 물고 물리는 원형 대기 구조를 형성함

예를 들어 스레드 A가 lockA를 잡고 lockB를 기다리는 동안, 스레드 B는 lockB를 잡고 lockA를 기다리면 순환 대기가 완성되어 데드락이 발생합니다.

실무에서의 해결 및 예방 방법

데드락을 다루는 접근법은 크게 예방, 회피, 탐지 후 복구로 나뉩니다. 실무에서 가장 널리 쓰이는 방법은 예방입니다.

  • 락 순서 고정: 모든 스레드가 자원을 항상 동일한 순서로 획득하도록 규칙을 정하면 순환 대기 자체가 생기지 않습니다.
  • 타임아웃 설정: 락 획득 대기 시간에 제한을 두고, 시간이 지나면 실패 처리 후 재시도하는 방식입니다. 데이터베이스에서 lock_timeout 설정이 대표적입니다.
  • 트랜잭션 범위 최소화: 트랜잭션이 여러 자원을 오래 점유하지 않도록 짧게 유지합니다.
  • 데드락 탐지 후 롤백: 대부분의 RDBMS는 자체적으로 순환 대기 그래프를 감지해 한쪽 트랜잭션을 강제로 롤백시킵니다.

결국 데드락은 완전히 없애기보다는 발생 가능성을 낮추고, 발생했을 때 빠르게 감지해 복구하는 전략을 함께 설계하는 것이 현실적인 해법입니다.

댓글 남기기