운영체제는 교착 상태가 일어나지 않도록 해야한다.
운영체제는 교착 상태를 예방, 회피, 회복 할 수 있다.
예방은 교착 상태 발생 조건에 부합하지 않게 자원을 분배하는 것이다.
회피는 교착 상태가 발생하지 않을 정도로 자원을 분배하다가 교착 상태 발생 위험이 있다면 자원을 할당하지 않는 방식을으로 회피할 수 있다.
회복은 자원을 제약 없이 할당하다가 교착 상태가 검출되면 교착 상태를 회복하는 방식을 사용한다.
자세히 알아보자.
교착 상태를 예방하는 방법은 교착 상태 발생 조건 네 가지 중 하나를 충족하지 못하게 막는 방법과 같다.
교착 상태 발생 조건은 상호 배제, 점유와 대기, 비선점, 원형 대기이다. 이 중 어느 한가지만 만족시키지 않게 할당하면 교착 상태는 발생하지 않는다.
자원의 상호 배제를 없앤다면 모든 자원을 공유 가능하게 바뀔 것이다. 또한, 현실적으로 모든 자원의 상호 배제를 없애기는 어렵기 때문에 이 방법을 사용하는 것은 무리가 있다.
점유와 대기를 없앤다는 것은 한 프로세스가 하나의 자원을 점유한 채 다른 자원을 점유하는 것을 막는 것이다.
점유와 대기를 없애면 운영체제는 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분한다.
이는 이론적으로 가능하다, 하지만 자원의 활용률이 낮아질 가능성이 매우 높다. 한 프로세스에 자원을 몰아주게 된다면 사용되지 않지만 오랫동안 할당 되는 자원이 다수 발생할 것이고, 자원이 필요해도 오랫동안 기다릴 수밖에 없는 프로세스들 또한 다수 발생하게 될 것이다.
또한, 많은 자원을 사용해야하는 프로세스가 불리해진다. 자원을 많이 사용해야 하는 프로세스는 자원을 적게 사용하는 프로세스에 비해 동시에 자원을 사용할 타이밍을 확보하기가 어렵기 때문이다.
이렇게 되면 무한정 기다리게 되는 기아 현상이 발생할 우려가 있다.
비선점 조건을 없애면 자원을 이용 중인 프로세스에게서 해당 자원을 빼앗아 올 수 있다. 이 방식은 선점하여 사용할 수 있는 자원에 대해서는 효과적이다. 예를 들어 CPU는 프로세스들이 선점할 수 있는 대표적인 자원이다.
하지만 프린터 자원을 이용하는 도중에 다른 프로세스가 프린터 자원을 빼앗아 사용하기는 어려울 것이다.
그렇기에 비선점 조건을 없애서 교착 상태를 예방하는 방식은 범용성이 다소 떨어지는 방법이다.
모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당하면 원형 대기를 없앨 수 있다. 이렇게 하면 두 프로세스가 자원을 점유한 채 서로의 자원을 기다리는 일은 발생하지 않는다.
하지만 컴퓨터 내에 존재하는 수많은 자원에 번호를 붙이는 것은 쉬운일이 아니다. 또한 특정 자원의 할용률이 떨어진다는 단점이 있다.
이처럼 교착 상태 발생 조건을 제거하여 교착 상태를 예방하는 것은 가능은하나 여러 부작용이 따른다.
교착 상태 회피는 교착 상태가 발생하지 않을 정도로 자원을 할당하는 방식이다.
교착 상태 회피에서 모든 프로세스가 정상적으로 자원을 할당받고 실행이 무사히 종료될 수 있는 상태를 안전 상태(safe state)라 부른다. 또한 교착 상태가 발생할 수 있는 상황을 불안전 상태(unsafe state)라고 부른다.
안전 순서열(safe sequence)는 교착 상태 없이 안전하게 프로세스들이 자원을 할당받을 수 있는 순서를 의미한다. 불안전 상태는 안전 순서열이 없는 상황이다. 이 상태에 놓이면 교착 상태가 발생할 수 있는 위험이 있다.
이를 정리하여 말하면, 교착 상태를 회피하는 방식은 항상 안전 상태를 유지하도록 자원을 할당하는 방식을 말한다.
교착 상태 검출 후 회복은 교착 상태가 발생 했을 때 조치하는 방식이다.
검출 후 회복 방식에서, 운영체제는 프로세스들이 자원을 요구 할 때 모두 할당하고, 교착 상태 발생 여부를 주기적으로 검사한다.
교착 상태가 발생한 것이 검출되면 아래와 같은 방법으로 회복한다.
교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식이다.
교착 상태가 해결될 때까지 다른 프로세스로부터 자원을 빼앗고 한 프로세스에 할당하는 방식이다.
운영체제는 교착 상태에 빠진 프로세스를 모두 강제 종료하거나, 교착 상태가 없어질 때까지 한 프로세스씩 강제 종료한다.
전자는 많은 프로세스들이 작업 내역을 잃게 될 가능성이 있고, 후자는 그러한 프로세스들이 적어지지만 교착 상태가 없어졌는지 확인하는 과정에서 오버헤드를 발생시킨다.
교착 상태를 아예 무시하는 방법이다.
의심 가는 스레드를 종료시키거나 시스템을 재시작시킨다.
거의 발생하지 않는 것에 비해 교착 상태 해결에는 많은 비용이 들기 때문에 사용하는 경우가 많다.