눈팅하는 게임개발자 블로그
DeadLock(교착상태) 본문
DeadLock 발생 조건 4가지 (Coffman Condition)
- Mutual Exclusion(상호 배제)
모든 자원은 한 번에 하나의 스레드에게만 점유된다.
한 스레드가 해당 자원에 대한 소유권을 가졌다면 다른 스레드는 해당 자원에 접근할 수 없음.
- Hold & Wait(소유 & 대기)
스레드가 한 자원의 소유권을 가진 상태에서 다른 자원의 소유권을 요청한 상태로 대기한다.
- No Preemption(비선점)
스레드가 가진 자원에 대한 소유권을 강제로 뺏어올 수 없다.
- Circular Wait(환형 대기)
한 그룹의 스레드들에 대해(자원 할당 그래프에서)
각 스레드들이 다른 스레드가 소유한 자원을 요청하는 원형의 고리가 형성된다.
위의 4가지 조건을 모두 만족하는 시스템에서는 교착상태가 발생한다.
교착상태 해결법
- 교착상태 예방
교착상태 발생 여지를 차단하여 예방한다.
위의 코프만 조건 중 하나의 조건이 성립되지 못하도록 시스템을 구성한다.
- 교착상태 회피
자원 할당 알고리즘(banker's algorithm)에서 미리 교착 상태의 발생 여부를 판단하여
교착상태가 발생하지 않을 것이라고 확신하는 경우에만 해당 스레드에 자원을 할당.
하지만 자원을 할당할 때마다 교착 상태를 검사하는 회피 정책은 시스템 성능을 저하시킨다.
- 교착상태 감지 및 복구.
백그라운드에서 교착 상태를 감지하는 프로세스를 실행하여 교착상태가 발견되면 해당 교착상태를 해제한다.
교착상태 감지 프로세스가 늘 실행되어야 하므로 그만한 비용이 발생한다.
- 교착상태 무시.
교착상태에 대한 대비를 하지 않는다.
리눅스, 윈도우 등 대부분의 운영체제에서 사용하는 가장 일반적인 방법.
교착상태를 대비하기 위한 방법들의 비용 소모가 교착상태 발생률에 비해 너무나도 높기 때문에 취하는 방법.
심각한 시스템 오류를 일으키는 교착상태가 아닌 이상 무시한다.