교착 상태 (Deadlock)

컴퓨터과학·AI
한 줄 정의: 둘 이상의 프로세스나 스레드가 서로 상대방이 점유한 자원을 기다리며 무한정 멈춰 있는 상태입니다.

쉽게 풀면

좁은 외길 다리 위에서 양쪽에서 온 자동차 두 대가 마주쳤다고 생각해보세요. 서로 "네가 먼저 후진해"라며 양보를 기다리기만 하면 두 차 모두 영원히 움직이지 못합니다. 컴퓨터 프로그램에서도 이런 일이 벌어집니다. 프로세스 A는 자원 1을 가진 채 자원 2를 기다리고, 프로세스 B는 자원 2를 가진 채 자원 1을 기다리면, 둘 다 서로가 자원을 놓아주기만 기다리다가 영원히 멈춰버립니다. 이 상태가 바로 교착 상태입니다.

왜 중요한가

교착 상태는 운영체제, 데이터베이스, 분산 시스템, 병렬 프로그래밍 등 여러 자원을 여러 주체가 동시에 다투는 거의 모든 시스템에서 발생할 수 있는 근본적인 문제라, 시스템의 신뢰성과 가용성을 다루는 논문에서 반드시 고려해야 하는 실패 모드로 등장합니다. 특히 다중 코어 환경이나 분산 데이터베이스처럼 동시성이 커질수록 발생 가능성과 파급 효과가 커지기 때문에, 이를 예방·탐지·회복하는 기법 자체가 하나의 독립된 연구 주제로 다뤄지기도 합니다.

논문에서는 이렇게 쓰입니다

"두 트랜잭션이 서로 다른 순서로 락(lock)을 획득할 경우 교착 상태(deadlock)에 빠질 수 있어, 락 획득 순서를 고정하는 방식으로 이를 방지했다."

이 문장은 데이터베이스 트랜잭션들이 자원을 잠그는 순서가 뒤엉키면 서로 기다리다 멈추는 문제가 생길 수 있어, 항상 같은 순서로 자원을 잠그도록 규칙을 정해 해결했다는 뜻입니다.

"분산 시스템에서는 노드 간 메시지 지연으로 인해 자원 할당 그래프상의 순환 대기가 발생할 수 있으며, 본 연구는 타임아웃 기반 탐지 기법을 제안하였다."

여러 컴퓨터가 네트워크로 연결된 분산 환경에서는 메시지가 늦게 도착하는 것만으로도 서로 기다리는 순환 구조가 생길 수 있고, 이를 일정 시간 이상 응답이 없으면 탐지해내는 방법을 제안했다는 뜻입니다.

조금 더 깊게 보면

교착 상태가 성립하려면 자원을 독점 사용, 이미 가진 자원을 유지한 채 다른 자원을 대기, 강제로 자원을 빼앗을 수 없음, 대기가 순환 구조를 이루는 조건이 동시에 만족되어야 한다는 것이 고전적으로 알려져 있습니다. 이 조건 중 하나만 깨뜨려도 교착 상태를 막을 수 있어서, 락 획득 순서를 고정하거나 자원 요청을 한 번에 몰아서 하는 방식이 실무에서 흔히 쓰이며, 발생을 막는 대신 자원 할당 그래프에서 순환을 찾아 사후에 탐지하고 복구하는 접근도 함께 연구됩니다.

주의할 점

교착 상태는 경쟁 상태와 헷갈리기 쉽지만 다른 개념입니다. 경쟁 상태는 결과가 실행 순서에 따라 잘못 나오는 문제이고, 교착 상태는 아예 진행 자체가 멈춰버리는 문제입니다. 뮤텍스와 세마포어 같은 동기화 도구도 사용 방식이 잘못되면 오히려 교착 상태를 유발할 수 있습니다.

관련 용어