상호 배제 (Mutual Exclusion)
자원은 한 번에 한 프로세스만 사용할 수 있어야 함
점유와 대기 (Hold and Wait)
최소한 하나의 자원을 점유한 채로, 다른 프로세스에 할당된 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 함
비선점 (No Preemption)
다른 프로세스에 할당된 자원을 강제로 뺏을 수 없어야 함
환형 대기 (Circular Wait)
대기 프로세스 집합이 순환 형태로 자원을 대기해야 합니다. (A는 B의 자원을, B는 A의 자원을 대기)
상호 배제 부정: 모든 자원을 공유하게 함. 하지만 동기화 문제가 있어서 안 됨.
점유 대기 부정
비선점 부정: 이미 사용되는 자원 뺏음. 근데 락 걸려있는 건 안 되니까 얘도 잘 안 됨.
환형 대기 부정
안전 상태 : 시스템이 모든 프로세스의 최대 자원 요구량을 차례대로 들어줄 수 있는 순서(Safe Sequence)가 존재하는 상태
프로세스가 자원을 요청하면, 시스템은 해당 자원을 빌려준 뒤에도 안전 순서열이 존재하는지 가상으로 시뮬레이션 함
안전 순서열이 존재한다면 자원을 할당하고, 그렇지 않다면 다른 프로세스가 자원을 반납할 때까지 할당을 거부
최대 자원 요구량을 미리 알아야 하고 오버헤드가 큼
예방하는 것 자체가 오버헤드가 크기 때문에, 데드락 발생을 허용하되 주기적으로 체크하고 발견 시 조치함
자원 할당 그래프를 통해 사이클을 찾게되면
데드락에 빠진 모든 프로세스를 Kill하거나 (실하지만 작업 손실이 큼)
순서대로 Kill하며 복구확인 (비용 계산이 필요)
자원을 강제로 선점하여 다른 프로세스에게 부여 (자원을 계속 뺏기기만 하는 기아 발생 가능)
근데 애초에 데드락이 아주 드물게 발생하기도 하고, 예방하는 것도, 탐지하고 복구하는 것도 너무 큰 오버헤드
그래서 타조가 모래에 머리박고 모르쇠하듯이 OS에서는 아무것도 안하고 사용자가 처리하도록 함
현대의 많은 OS(Windows, Linux 등)가 채택하는 방식으로, 데드락 해결 비용보다 시스템을 그냥 재부팅하거나 사용자가 프로세스를 종료하는 것이 경제적이라고 판단
게임 스레드에서 캐릭터 자원을 로드하고 총모델을 필요로 함. 다른 스레드에서 총모델을 로드하고 캐릭터 자원이 필요로 함. 이럴 때 서로 데드락이 걸린다.
또, 게임 스레드와 AI관련 스레드가 있을 때 게임 스레드에선 AI연산이 끝나면 업데이트하려고 기다리고 AI스레드는 게임 스레드가 업데이트 되어야 연산하려고 기다리는 상황. 이렇게 자원이 아니라 스레드 간의 데드락도 존재