🎃 결코 일어나지 않을 일을 기다린다. 🎃
다시 부팅을 해야하며, 시스템의 일부가 deadlock이 발생하면 재부팅 없이 복구가 가능하다.
Deadlock이 발생하는 조건
- Mutual exclusion, 즉 하나의 프로세스만이 resource를 사용한다.
- resource를 가진 상태에서 다른 resource를 요청한다. (hold and wait)
- 프로세스가 다른 프로세스에 resource를 요청하면서 싸이클이 형성된다. (circuit wait)
🎀 Pi -> Ri -> Pj -> Rj -> Pi
- 현재 resource를 사용중인 프로세스는 resource를 빼앗기지 않는다. 대기중인 프로세스는 기존의 프로세스의 작업이 끝나기를 기다린다. (no preemption)
싸이클이 만들어져 원이 생겼다고 무조건 deadlock이 발생하는 것은 아니다.
resource에 충분한 인스턴스가 있으면 deadlock에 빠지지 않을 수도 있다.
하나의 인스턴스에 하나의 resource 타입이 있으면 deadlock이 발생한다.
Deadlock 처리법
resource의 활용도를 낮춰 미리 예방하는 방법과 resource의 활용도를 높여 deadlock에 가까이 가지만, 피해가는 회피 방법이 있다.
- 만약 deadlock의 상태에 빠지면 시스템이 회복하도록 한다.
- 사용자의 무분별한 resource 요청으로 인해서 deadlock에 빠지면 그냥 둔다. 사용자가 스스로 해결하게 하는 것이다.
- 사용자의 어플리케이션까지 분석하고 예측하면 시스템의 수행능력이 현저이 떨어지기 때문이다.
- 사용자가 요청하는 resource중 빠르게 deadlock의 판단이 가능한 요소가 있다면, 빠른 해결이 좋다.
이를 통해 시스템 속도가 높아진다. (lock과 관련된 부분을 OS가 처리해준다.)
Deadlock Prevention
- Mutual Exclusion은 부정할 수 없다. (하나의 프로세스만 공유 영역에 접근 가능)
- resource를 가진 한 프로세스가 어떤 또 다른 resource를 요청하면 프로세스가 수행하기 전에 필요한 resource를 모두 요청한다. (Hold and wait)
이를 통해서 필요한 resource를 모두 가지고 있어야지만 다른 resource를 요청할 수 있다.
🎆 일부 resource가 획득 불가능할 시 획득이 가능할 때 까지 기다린다.
당장 필요하지 않는 resource도 점유하기 때문에 resource 활용도가 떨어진다.
🎪 결과 출력 시간 길어짐, resource를 다 가져가서 starvation이 일어날 수 있다.
- 다른 프로세스가 점유한 resource를 기다릴 때, 이를 빼앗을 수 있다. (No Preemption)
프로세스의 resource 요청시, 거절당하면 가진 resource를 모두 해제한다. 나중에 모든 resource를 획득할 수 있을 때 수행한다.
기다릴 때 자신이 가진 resource는 중복 접근을 막는다.
나중에 다시 실행할 때 처음부터 하는 것이 아니라, resource를 해제한 시점부터 프로세스가 진행된다.
- 프로세스가 요청하는 resource에 대해서 오름차순으로 순번을 매긴다. (Circuit Wait)
🖼 Lock Ordering(동적으로 순서 결정)은 모든 deadlock을 해결하지는 못한다.
Deadlcok Avoidance
- 시스템에 정보 제공이 필요하다.
- 각 프로세스가 필요한 resource의 maximum 개수를 알려야한다.
- 모든 resources의 할당 상태를 동적으로 검사하여 wait가 싸이클로 형성된 상태가 발생하지 않는다는 확신이 있어야 한다.
- 현재 남아있는 resources의 개수, 할당된 resources의 개수, resources의 최대 개수를 계속 체크하고 deadlock이 발생할 것 같으면 resource의 요청을 거절한다.
프로세스가 resource를 요청할 때 시스템은 resource를 할당해도 safe state 인지 결정해햐 한다.
- 자기가 가진 resource와 자기 이전에 요청한 프로세스의 resource의 합이 maximum resource와 작거나 같으면, safe state이다.
- 내가 resource를 기다리는데 나한테 요청한 resource가 들어올 가능성이 없다면 unsafe