데드락: 두개 이상의 프로세스가 제한된 리소스를 경쟁적으로 접근할 경우 발생한다. 어떤 프로세스가 절대 일어나지 않을 이벤트를 기다리는 것을 말한다.
위 그림에서 어느 한 프로세스가 자원을 놔줘야 다른 프로세스가 그 자원을 사용하는데 서로 그러한 상태에 빠져있으니 절대 일이 진행되지 않는다.
데드락의 조건 중 하나라도 유지가 안되면 데드락을 예방할 수 있다.
공유불가 자원은 mutual exclusion이 항상 존재한다. 한 프로세스가 사용하면 다른 프로세스는 사용하지 못하고 기다려야 한다. 예를 들어 프린터가 있다.
공유가 가능한 자원은 상호배제적으로 접근을 요구하지 않아서 데드락이 발생하지 않는다. 예를 들어 read-only 파일이 있다.
일반적으로 자원들은 공유가 불가능하므로 mutual exclusion을 예방하는 것은 불가능하다.
hold and wait 조건 예방하기
: 프로세스가 자원을 요청할 때, 그 프로세스는 어떤 다른 리소스도 점유하고 있으면 안된다.
이런식으로 데드락을 예방할 시에 두개의 단점이 존재한다.
하나는 자원 사용률이 낮아질 수 있다는 것이다. 많은 자원들이 오랫동안 프로세스에 할당되었지만 사용되지 않는다. 그리고 기아현상이 일어날 수 있다. 인기 많은 자원들이 필요한 프로세스가 무한정으로 기다릴 수 있기 때문이다. 자원들 중 적어도 하나가 항상 다른 프로세스에 할당되어 있다.
강제회수를 허용한다.
이 조건을 만족하지 않는다는 것을 보장하기 위해 다음과 같은 방법을 사용할 수 있다.
Rj가 즉시 Pi에 할당될 수 없다면 R1, R2, ..., Ri는 강제회수될 것이다.
cycle이 형성되지 않도록 한다. 선형 ordering으로 예방할 수 있다.
각 프로세스는 증가하는 열거 순서로 리소스를 요청한다.
리소스는 tape drv, disk drv, printer가 될 수 있다.
F(tape drv) = 1, F(disk drv) = 5, F(printer) = 12
현재 보유하고 있는 정수 값보다 큰 것을 요청한다. --> 선형