해결 방법으로는 예방, 회피, 검출 회복 방법이 있습니다.
상호 배제와 비선점을 예방하긴 어렵고 점유와 대기, 원형 대기는 프로세스의 작업 방식을 제한하고 자원 낭비가 있어 사용하기 어렵습니다.
시스템 내에 있는 독점적으로만 사용 가능한 자원을 없애버리는 방법입니다. 만약 모든 자원을 공유할 수 있다면 교착 상태가 발생하지 않습니다. 그러나 현실적으로 모든 자원을 공유할 수 없으며 상호 배제로 보호해야 하는 자원이 있습니다. 따라서 상호 배제를 무력화하는 것은 어렵다고 볼 수 있습니다.
모든 자원을 빼앗을 수 있도록 만드는 방법입니다. 하지만 임계구역을 보호하기 위해 잠금을 사용하면 자원을 빼앗을 수 없을 뿐만 아니라 상호 배제도 보장할 수 없어집니다. 따라서 현실적으로 시스템의 모든 자원을 빼앗을 수 있도록 허용할 수 없습니다.
프로세스가 자원을 점유한 상태에서 다른 자원을 기다리지 못하게 하는 방법입니다. 즉 전부 할당하거나 아예 할당하지 않는 방식(all or nothing)을 적용합니다. 프로세스는 시작 초기에 사용할 모든 자원을 한번에 점유하거나 아니면 자원을 모두 반납해야하는 방식입니다.
점유와 대기를 하는 프로세스들이 원형을 이루지 못하도록 막는 방법입니다. 자원을 한 방향으로만 사용하도록 설정함으로써 원형 대기를 예방할 수 있으며 모든 자원에 숫자를 부여하고 숫자가 큰 방향으로만 자원을 할당하도록 하면 됩니다.
교착상태 회피는 프로세스에 자원을 할당할 때 어느 수준 이상의 자원을 나눠주면 교착 상태가 발생하는지 파악해 그 수준 이하로 자원을 나눠주는 방법입니다. 교착상태가 발생하지 않는 범위 내에서만 자원을 할당하고 교착 상태가 발생하는 범위에 있으면 프로세스를 대기시킵니다.
자원의 총 개수와 현재 할당된 자원의 수를 기준으로 시스템을 안정 상태와 불안정 상태로 나눠 시스템이 안정 상태를 유지하도록 자원을 할당합니다. 할당된 자원이 적으면 안정 상태가 크고 할당된 자원이 커질수록 불안정 상태가 커지게 됩니다. 즉, 회피는 안정상태를 유지할 수 있는 범위 내에서 자원을 할당함으로써 교착 상태를 회피합니다.
은행원 알고리즘은 은행이 대출해주는 방식, 대출 금액이 대출 가능한 범위 내(안정상태)이면 허용되지만 아니면 거부되는 것과 유사함에서 나왔습니다.
각 프로세스는 자신이 사용할 자원의 최대 개수를 운영체제에게 알립니다. 왜냐하면 운영체제가 자원을 할당할 때 시스템의 상태를 파악하는데 꼭 필요한 정보기 때문입니다.
은행원 알고리즘에서 사용하는 변수
자원을 할당할 때의 기준
안정 상태의 예
Total = 14, Available = 2
Process | Max | Allocation | Expect |
---|---|---|---|
P1 | 5 | 2 | 3 |
P2 | 6 | 4 | 2 |
P3 | 10 | 6 | 4 |
현재 가용한 자원은 2개이고 P2 기대 자원이 2개이므로 안정상태입니다. 기대자원까지 할당받고 실행을 종료하면 6개를 반환하고 P1이나 P3에 할당해 전체 작업을 완료할 수 있습니다.
불안정 상태의 예
Total = 14, Available = 1
Process | Max | Allocation | Expect |
---|---|---|---|
P1 | 7 | 3 | 4 |
P2 | 6 | 4 | 2 |
P3 | 10 | 6 | 4 |
가용 자원이 1인데 어떠한 프로세스의 기대 자원에 충족되지 않으므로 불안정 상태입니다.
검출은 운영체제가 프로세스의 작업을 관찰하면서 교착 상태 발생 여부를 계속 주시하는 방식입니다. 교착 상태가 발견되면 해결하기 위해서 회복 단계로 넘어가게 됩니다.
타임아웃을 이용한 검출은 일정 시간 동안 작업이 진행되지 않은 프로세스를 교착상태가 발생한 것으로 간주해 처리하는 방법입니다.
자원 할당 그래프를 보면 시스템 내의 프로세스가 어떤 자원을 사용하고 있는지, 기다리고 있는지 알 수 있습니다. 단일 자원을 사용하는 경우 자원 할당 그래프에 사이클이 존재하면 교착상태가 발생한다고 말할 수 있지만 다중 자원일 경우 교착 상태가 아닐 수 있습니다.
자원 할당그래프를 이용해 교착 상태를 검출하는 방법은 프로세스의 작업 방식을 제한하지 않고 교착 상태를 정확히 판단할 수 있다는 장점이 있습니다. 하지만 그래프를 유지하고 갱신하고 사이클 검사까지 하는 작업으로 인하여 오버헤드가 발생한다는 단점이 있습니다. 이 문제를 해결하기 위해 자원이 할당될 때마다 사이클 검사하는 것이 아닌 일정 시간마다 주기적으로 확인하는 방법이 있습니다.
교착 상태가 검출되면 교착 상태를 푸는 후속 작업을 하는데 이것을 회복이라고 합니다. 회복 단계에서는 교착 상태를 유발한 프로세스를 강제로 종료시킵니다.
회복 단계에서는 강제 종료 말고도 강제 종료된 프로세스가 실행되기전 시스템을 복구시키는 일도 해야합니다. 복구는 명령어가 실행될 때마다 체크포인트를 생성해 가장 최근의 검사 시점으로 돌아가는 식으로 합니다. 하지만 이 방식은 시스템에 큰 부하를 만들 수 있어서 무분별하게 사용하지 않도록 주의해야 합니다.