멈춤 구조
교착 상태는 모두가 기다려 아무도 진행하지 못하는 상태다
경쟁 상태가 너무 빨라서 생기는 문제라면, 교착 상태는 필요한 자원을 서로 붙잡고 기다려 시스템 진행이 멎는 문제다.
Thread A
Lock 1 보유, Lock 2 대기
Thread B
Lock 2 보유, Lock 1 대기
결과
강제 회수 없이는 두 실행 흐름 모두 앞으로 나가지 못한다.
보유
이미 잡은 자원 유지
필요한 자원을 기다리면서 기존 자원을 놓지 않는다.
대기
다른 실행 흐름의 반납 대기
대상 자원은 이미 누군가 점유하고 있다.
비회수
운영체제가 빼앗지 못함
사용 중인 자원을 안전하게 강제 회수하기 어렵다.
순환
기다림이 닫힌 고리 형성
A가 B를, B가 A를 기다리는 구조가 만들어진다.
조건
진단 질문
깨뜨리는 방향
상호 배제
동시에 공유할 수 없는 자원인가
읽기 공유, 불변 데이터, 복제 자원으로 완화한다.
점유와 대기
잡은 채로 다른 자원을 기다리는가
필요 자원을 한 번에 요청하거나 순서를 정한다.
비선점
운영체제가 중간 회수할 수 없는가
타임아웃, 취소, 재시도를 설계한다.
순환 대기
대기 관계가 고리로 닫혔는가
락 획득 순서를 전역 규칙으로 통일한다.
레이스와 구분
레이스는 순서 불확실성, 데드락은 진행 불가능성이다.
탐지 단서
CPU 사용은 낮은데 대기 스레드만 늘면 의심한다.
예방 관점
네 조건 중 하나만 확실히 깨도 데드락은 성립하지 않는다.