사실, 이 조건 중에 한 가지라도 만족하지 않으면 deadlock이 발생하지 않는다. 그리고 이 4가지 조건은 서로 완전히 독립적인 것은 아니다.
현재의 대부분의 OS는 deadlock을 막는 것은 불가능하다. 그렇기에 deadlock이 발생하면 여러 OS들은 제각기 다른 비 표준 방식으로 deadlock에 대응한다.
deadlock의 예방 방법은 deadlock이 되지 않도록 하는 방법이다.
deadlock을 예방하는 방법은 많은 자원의 낭비와 문제를 발생시키기 때문에 효율적인 방법은 아니라고 할 수 있다.
Deadlock이 발생하기 전에 deadlock을 예상하여 safe state에서만 자원 요청을 허용하는 방법이다. 자원을 신중하게 할당하면 deadlock을 회피할 수 있다.
이를 위해서는 다음과 같은 가정이 필요하다.
→ 현실성이 부족하다. 또한, 자원 요청이 있을 때마다 알고리즘을 사용한다는 것은 상당한 overhead임.
unsafe state라서 반드시 deadlock이 발생하지는 않는다.
1번 그래프에서 프로세스 P2가 자원 R2를 요청하여 자원을 할당 받는다면
다음과 같이 cycle이 발생하므로 자원 요청을 승인 할 수 없다.
반대로 프로세스 P1이 자원 R2를 요청하여 자원을 할당 받는다면
cycle이 발생하지 않아 자원을 요청하여 할당 받을 수 있음.
탐지 알고리즘을 사용하여 deadlock이 발생했는지 탐지한다. deadlock이 탐지 되었다면 복구 기법을 통해 deadlock을 복구한다.
이 방식은 지속적으로 확인하는 작업이 필요하기 때문에 성능 저하가 발생한다.
대기 그래프(wait-for graph)
각 자원 유형마다 instance가 하나 있는 경우 자원 할당 그래프를 변형한 대기 그래프를 사용하여 deadlock을 탐지한다.
대기 그래프에서 Pi→Pj는 프로세스 Pi가 Pj프로세스가 보유하고 있는 자원을 기다리고 있음을 나타낸다.
대기 그래프에 cycle이 있다면 deadlock을 의미한다.
주기적으로 대기 그래프에 주기가 있는지 탐지 알고리즘을 호출하여 deadlock을 탐지한다.
은행원 알고리즘(Banker’s Algorithm)
각 자원 유형마다 instance가 여러 개 있는 경우 은행원 알고리즘을 사용하여 deadlock을 탐지한다. deadlock avoidance에서 사용하는 알고리즘과는 차이가 있다.
각 프로세스의 자원 요청 개수를 사용한다.
현재 상태가 safe state인지 확인한다.
unsafe state라면 deadlock이라고 판단한다.
첫 번째로 3만원 더 필요한 첫번째 고객에게 3만원을 빌려주고 첫번째 고객이 일을 해결하고 갚을 때까지 기다렸다가 다른 고객에게 돈을 빌려주는 방법이 있다.
아니면 두 번째 고객에게 남은 4만원을 빌려주고 두번째 고객이 일을 해결하고 갚을 때까지 기다리는 방법이 있다. 하지만 세번째 고객에게는 통하지 않는다. 은행은 4만원이 남아있는데, 세번째 고객은 5만원이 더 필요하기 때문이다. 돈을 빌려줄 수 있고, 다시 돈을 돌려 받을 수 있는 상태를 safe state라고 한다.
1. 고객1 - 고객2 - 고객3
2. 고객2 - 고객1 - 고객3
3. 고객2 - 고객3 - 고객1
이런 순서대로 모든 고객에게 돈을 빌려줄 수 있고 이를 safe state가 존재한다고 한다.
근데, 만약에 60원이 필요한 고객3이 너무 급하다고 25원 말고 45원을 달라고 했다고 하자. 그럼 은행에 남는 돈은 5원 밖에 없다. 이 상황에서는 세 고객 중 아무도 해결해 줄 수 없다. 이 상태를 unsafe state, deadlock이라고 한다.
deadlock에 있는 프로세스를 종료하는 방식이다. 종료에는 2가지 방식이있다.