정적인 상태의 프로그램이, 자원을 할당받아 동적인 프로세스가 된다. 하지만 CPU, 메모리 등의 자원의 양은 제한되어있기 때문에 원하는 모든 프로세스를 무제한으로 동시에 실행시키는 것은 불가능하다. 자원이 이미 다른 프로세스에 의해 점유된 상태에서, 해당 자원을 다른 프로세스들이 너도나도 요구하게 된다면, 프로세스들이 실행되지 못하고 자원 할당을 한없이 기다리는 상태에 놓이게 될 것이다.
이번에는 이러한 '교착상태' 의 개념과 교착상태를 어떻게 해결하는 지에 대해 살펴보도록 한다.
상호배제 원칙으로 인해 서로의 공유자원을 프로세스들이 요구함으로써 무한정 대기하는 상황
둘 이상의 프로세스가 자원을 점유한 상태에서, 서로 다른 프로세스가 점유중인 자원을 요구하면서 무한정 기다리고 있는 현상을 말함
이는 상호배제(Mutual Exclusion)
로 인해 나타나는 문제점으로, 상호배제는 여러 프로세스가 공유하는 자원에 대해서, 특정 시점에서 한 개의 프로세스만이 공유자원을 점유할 수 있는 원칙 을 말함
임계영역(Critical Section)
이라고 하며, 상호배제는 임계영역을 유지하는 기법인 셈동기화(Synchronization)
라고 부르는 것교착상태가 일어나기 위한 필요 조건은 4가지로, 여기서 하나라도 충족되지 않으면 교착상태가 발생하지 않음
(또한 4가지 조건을 모두 충족했다고 해서 반드시 교착상태가 일어나는 것도 아님)
상호배제(Mutual Exclusion)
점유대기(Hold and Wait)
비선점(Non-preemption)
환형대기(Circular Wait)
.
교착상태 처리 전략은 크게 방지
, 회피
, 탐지 및 복구
의 세가지로 나눌 수 있음
1) 방지
: 교착상태가 발생하기 위한 4가지 필요 조건 중 적어도 하나 이상이 발생하지 않도록 함
상호배제 조건의 제거
점유 대기 조건의 제거
점유 대기를 없애려면 프로세스가 자원을 요청할 때, 해당 프로세스는 어떠한 자원도 할당받지 않은 상태 로 만들면 됨
필요한 모든 자원을 한꺼번에 요구하여 할당받도록 할 수 있음
혹은, 자원을 부분적으로 요청하여 할당받도록 하되, 추가 요청시에는 이전에 가지고 있던 자원을 모두 해제하도록 할 수도 있음
기아상태(starvation)
이 발생해버리는 것비선점 조건의 제거
우선 어떤 자원을 점유하고 있는 프로세스가 다른 자원을 요청했을 때, 즉시 할당받지 못하는 경우에 점유중이던 자원을 해제하도록 할 수 있음
혹은 프로세스가 어떤 자원을 요청했을 때, 가용 여부를 조사하여 가용상태이면 할당하고 그렇지 않은 경우에는 해당 자원이 다른 자원을 할당받기 위해 대기중인 프로세스에 할당되어 있는 지를 조사하여, 대기중인 프로세스로부터 자원을 선점하도록 할 수도 있을 것
환형 대기 조건의 제거
순환 형태로 프로세스가 자원을 요구하며 대기하지 않고, 선형으로 프로세스가 자원을 요구하는 형태 가 되도록 함
자원에 고유번호를 할당하고, 프로세스가 특정 번호를 기준으로 오름차순으로 자원을 요청하도록 할 수 있음
혹은, 프로세스가 특정 자원을 요구할 때, 요구할 자원의 일련번호보다 큰 번호를 받은 자원은 모두 해제하도록 할 수도 있음
이 방식은 결국 일련번호를 부여하기 위한 함수가 어떻게 정의되냐에 따라 성능이 좌우됨
.
2) 회피
: 프로세스의 자원 사용에 관한 사전 정보를 활용하여, 교착상태의 발생 여부를 예상하고 안전한 상태(Safe State)에서만 자원 요청을 하도록 하는 방법
사전정보로는 현재 할당된 자원
, 가용 상태의 자원
, 프로세스들의 최대 요구량
의 세가지가 활용됨
교착상태를 회피하면서 각 프로세스에게 최대 요구량까지 자원을 할당하 수 있는 상태를 안전한 상태(Safe State)
라고 부름
안전한 상태는 다시 말해 안전 순서열(Safe Sequence)
이 존재하는 경우로 볼 수 있음
불안전 상태(Unsafe State)
라고 부름자원 할당 그래프(Resource-Allocation Graph Algorithm)
요청 간선
, 할당 간선
, 예약 간선
세 가지 종류의 간선을 활용하여 자원할당 그래프에서 사이클이 존재하면 교착상태가 발생할 것으로 간주위의 경우는 각 유형의 단위자원이 하나인 경우에 유효하며, 여러개인 경우에는 무조건이 아닌 교착상태 발생 가능성이 존재하는 것으로 간주해야 함
은행원 알고리즘 (Banker's Algorithm)
가용 자원
, 최대 요구
, 할당 자원
, 추가 요구
의 4가지 데이터 구조를 가지고 판단.
3) 탐지 및 복구
: 말 그대로 교착상태를 탐지하고 이를 회복하는 알고리즘을 활용하는 것탐지 : Shoshani & Coffman Algorithm
을 활용하는 것이 대표적(은행원 알고리즘과 유사함)
길이가 m과 n인 벡터 Work, Finish를 초기화
각 프로세스에 대해 Work := Available(가용자원) 으로 초기화했을 때, Alloc(할당 자원) 의 양이 0이 아닌 경우에는 해당 프로세스 번호에 해당하는 Finish 벡터값을 false로 둠(반대의 경우는 true)
Finish[i] = false 이면서 프로세스 i의 추가 요구량이 Work 이하인 프로세스 i를 탐색
위의 조건을 만족하는 프로세스 i가 존재한다면 Work = Work + (프로세스 i의 할당자원) 으로 바꾸고, 해당 프로세스 번호에 해당하는 Finish 벡터값을 true로 둠
이후 다시 위의 조건을 만족하는 프로세스 i를 탐색
만일 프로세스 i에 대해 Finish 벡터값이 false가 되는 상황이 발생하면, 시스템이 교착상태인 것으로 간주(Finish[i] = false인 프로세스 i는 교착상태)
회복 : 탐지기법으로 교착상태를 찾아내면 이를 회복하는데, 오퍼레이터가 직접 처리할 수도 있고 시스템이 자동으로 이를 복구하도록 할 수도 있음