기다림의 고리
두 작업이 각각 잠금 A와 B를 보유한 채 상대 잠금을 기다린다고 생각할 수 있다. 어느 쪽도 가진 잠금을 놓지 못하면 두 작업은 서로의 진행을 막는다.
단순히 작업이 오래 걸리거나 외부 응답을 기다린다는 사실만으로 교착 상태라고 판단할 수는 없다. 무엇을 기다리는지와 그 조건을 누가 충족할 수 있는지가 중요하다.
자원 모형의 조건
고전적인 자원 할당 모형에서는 상호 배제, 자원을 가진 채 추가 자원을 기다림, 자원의 강제 회수 불가, 순환 대기라는 조건들을 살펴본다. 조건 하나를 깨뜨리도록 설계하면 해당 모형의 교착을 예방할 수 있다.
대기 관계에 고리가 보이는 것의 의미는 자원 유형별 개수 등 모형의 가정에 따라 다르다. 단순화한 그림의 결론을 모든 시스템에 그대로 적용해서는 안 된다.
예방과 탐지
여러 잠금을 일관된 순서로 얻도록 하는 것은 순환 대기를 줄이는 대표적인 방법이다. 한꺼번에 자원을 요구하는 방식 등도 있지만 자원 활용과 구현 비용의 대가가 있다.
교착이 생길 가능성을 허용하고 대기 관계를 분석해 탐지한 뒤 일부 작업을 취소하는 접근도 있다. 복구 과정에서는 이미 실행한 작업의 부작용과 데이터의 일관성을 고려해야 한다.
비슷해 보이는 진행 문제
기아 상태는 어떤 작업이 자원을 계속 배정받지 못하는 문제이며, 모든 관련 작업이 서로 멈춘 교착과는 다르다. 활동은 계속하지만 유용한 진행이 없는 라이브락도 구별한다.
시간 제한을 두어 기다림을 끊는 방법은 복구에 도움을 줄 수 있지만 원인을 자동으로 제거하지는 않는다. 재시도 정책과 자원 해제의 정확성까지 함께 설계해야 한다.