mutal exclusion: 공유 가능한 자원들은 deadlock에 걸리지 않지만 근본적으로 공유가 불가능한 자원들 때문에 이 조건을 어겨 예방하는 것은 불가능하다.
hold and wait: 자원을 요청할 때 다른 자원들을 점유하지 않을 것을 보장하면 된다.
→ 할당된 모든 자원이 바로 사용되지 않기에 자원의 이용도가 낮을 수 있다. → 기아 상태 유발 가능 최소한 하나가 항상 다른 프로세스에게 할당되어 있기 때문에
no preemeption: 1번 resource를 잡고있는 process가 2번 resource를 요청했을 때 바로 받을 수 없다면 1번과 (다른 프로세스에게 할당된) 2번 모두 release 하도록 한다. release함으로써 preemption이 되어버린다. 또한, 프로세스는 요청 중인 새로운 자원을(2번) 할당받고 또한 대기 중에 선점되었던(끊겼던) 모든 자원(1번)을 회복할 때에만 다시 시작할 수 있다.
circular wait: resource에 ordering(순서)을 부여하여 순서에 맞게 resource를 요청할 수 있고 할당받을 수 있게 한다. 동시에 요청 불가능하기에 원형을 이룰 수 없다.
→ 장치의 이용률 저하, 시스템 처리율(throughput) 감소의 문제점
deadlock avoidance: deadlock 상황을 회피 → 자원이 어떻게 요청될 지에 대한 추가 정보를 제공하도록 요구한다.
How ?
$$ P_i \rightarrow R_j $$
$$ P_i \rightarrow R_j $$
$$ R_j\rightarrow P_i $$
사이클을 형성하지 않을 때에만 요청을 허용한다.
$$ Need[i,j] = Max[i, j] - Allocation[i, j] $$
deadlock이 발생했을 때 최대한 recover
daedlock 무시(reboot) -deadlock은 드물게 발생하여 이 방법은 비용이 적게 든다.
deadlock detection - wait-for 그래프 (Pi->Pj): Pi가 Pj를 기다릴 때 1) single instance 주기성을 가짐(deadlock인지 계속 확인)