1 교착 상태 해결 방법
교착 상태를 해결하는 방법은 예방, 회피, 검출이며 교착 상태를 발견한 후에 자원을 회복하는 방법도 있다.
2 교착 상태 예방
교착 상태 예방은 교착 상태를 유발하는 네 가지 조건 중에 하나라도 발생하지 않도록 막아 교착 상태를 처리하는 방법이다.
2.1 상호 배제 예방
시스템 내에 있는 독점적으로 사용할 수 있는 자원을 없애는 방법이다. 모든 자원을 공유하도록 하는 것인데, 시스템 내에는 공유할 수 없는 자원이 있다. 따라서 상호 배제 예방은 사실상 어렵다.
2.2 비선점 예방
모든 자원을 뺏을 수 있도록 만드는 방법이다. 그러나 임계구역 보호를 위해 잠금을 사용하면 자원을 뺏을 수 없고, 자원을 뺏어도 어떤 기준으로 뺏고, 얼마나 뺏을지를 결정하는 게 어렵다. 또한 아사 현상이 생길 수 있으므로 비선점 예방도 어렵다.
2.3 점유와 대기 예방
프로세스가 자원을 점유한 상태에서 다른 자원을 기다리지 못하게 all or nothing 방식을 적용한다. 이를 위해 프로세스는 시작 초기에 사용하려는 모든 자원을 한꺼번에 점유하거나 그러지 못할 경우 모두 반납해야 한다.
그러나 다음과 같은 단점이 있다.
프로세스가 자신이 사용하는 모든 자원을 자세히 알기 어렵다.
자원의 활용성이 떨어진다.
많은 자원을 사용하는 프로세스가 적은 자원을 사용하는 프로세스보다 불리하다.
결국 일괄 작업 방식으로 동작한다.
2.4 원형 대기 예방
자원을 한 방향으로만 사용하도록 설정함으로써 원형 대기를 예방한다.
즉 모든 자원에 숫자를 부여해 숫자가 큰 방향으로만 자원을 할당하는 것이다.
그러나 이 방법 또한 단점이 있다.
프로세스 작업 진행에 유연성이 떨어진다.
자원의 번호를 어떻게 부여할 것인지 문제이다.
3 교착 상태 회피
교착 상태 회피는 프로세스에 자원을 할당할 때 어느 수준 이상의 자원을 나눠주면 교착 상태가 발생하는지 파악하여 그 수준 이하로 자원을 나눠주는 방법이다. 즉 할당되는 자원의 수를 조절하여 교착 상태를 피하는 방법이다.
교착 상태 회피는 자원의 총수와 현재 할당된 자원의 수를 기준으로 시스템을 안정 상태와 불안정 상태로 나누고 시스템이 안정 상태를 유지하도록 자원을 할당한다.
안정 상태는 각 프로세스의 기대 자원과 비교하여 가용 자원이 크거나 같은 경우가 한 번 이상인 경우를 말한다.
교착 상태 회피는 다음과 같은 문제점이 있다.
프로세스가 자신이 사용할 모든 자원을 미리 선언해야 한다.
시스템의 전체 자원 수가 고정적이어야 한다.
자원이 낭비된다.
4 교착 상태 검출
교착 상태 검출은 운영체제가 프로세스의 작업을 관찰하면서 교착 상태 발생 여부를 계속 주시하는 방식이다. 만약 발견되면 이를 해결하기 위해 교착 상태 회복 단계를 밟는다.
교착 상태 검출은 타임아웃을 이용하는 방법과 자원 할당 그래프를 이용하는 방법이 있다.
4.2 타임아웃을 이용한 교착 상태 검출
일정 시간 동안 작업이 진행되지 않은 프로세스를 교착 상태가 발생한 것으로 간주하여 처리하는 방법이다. 특별한 알고리즘 없이 쉽게 구현할 수 있지만 문제점이 있다.
엉뚱한 프로세스가 강제 종료될 수 있다.
모든 시스템에 적용할 수 없다.
그럼에도 불구하고 이 방법은 선호하는 방법이다. 자원 할당 그래프를 이용하는 방법의 작업이 너무 많아 구현이 힘들기 때문이다. 그래서 타임아웃을 이용한 방법을 가벼운 교착 상태 검출이라고 부르고 자원 할당 그래프를 이용하는 방법을 무거운 교착 상태 검출이라고 부른다.
4.3 자원 할당 그래프를 이용한 교착 상태 검출
자원 할당 그래프를 통해 시스템 내의 프로세스가 어떤 자원을 사용하고 있는지 혹은 기다리고 있는지를 알 수 있다.
교착 상태가 없는 자원 할당 그래프는 사이클이 존재하지 않고, 교착 상태가 있는 경우 사이클이 존재한다.
자원 할당 그래프를 이용하는 방법은 프로세스의 작업 방식을 제한하지 않으면서 교착 상태를 정확히 파악할 수 있다는 것이 장점이다. 그러나 자원 할당 그래프를 유지하고 갱신하고 사이클을 검사하는 추가 작업으로 인해 오버헤드가 발생하는 단점이 있다.
5 교착 상태 회복
교착 상태가 검출되면 교착 상태를 푸는 후속 작업을 하는데 이를 교착 상태 회복이라고 한다.
교착 상태를 유발한 프로세스를 강제로 종료하는 방법을 통해 회복한다. 두가지 방법이 있다.
1) 교착 상태를 일으킨 모든 프로세스를 동시에 종료
이 방법은 종료된 프로세스들이 동시에 작업을 시작하면 다시 교착 상태를 일으킬 가능성이 크다. 따라서 종료 후에 순차적으로 실행한다.
2) 교착 상태를 일으킨 프로세스 중 하나를 골라 순서대로 종료
어떤 프로세스를 고를지 기준이 필요하다.
우선순위가 낮은 프로세스 먼저 종료, 우선순위가 같은 경우 작업 시간이 짧은 프로세스 먼저 종료, 두 조건 모두 같은 경우 자원을 많이 사용하는 프로세스 먼저 종료한다.
'프로그래밍 이론 & 책 > 운영체제' 카테고리의 다른 글
[운영체제] 7.2 메모리 주소 (0) | 2020.05.28 |
---|---|
[운영체제] 7.1 메모리 관리의 개요 (0) | 2020.05.28 |
[운영체제] 6.2 교착 상태 필요조건 (0) | 2020.05.27 |
[운영체제] 6.1 교착 상태의 개요 (0) | 2020.05.27 |
[운영체제] 5.3 임계구역 해결 방법 (0) | 2020.05.26 |