2개 이상의 프로세스가 다른 프로세스의 작업이 끝나기만을 기다리며 작업을 더 이상 진행하지 못하는 상태를 교착상태라고 합니다.
이러한 교착 상태는 시스템 자원, 공유 변수, 응용 프로그램과 같이 다른 프로세스와 공유할 수 없는 자원을 사용할때 발생합니다.
교착 상태의 필요 조건으로는 4가지가 있습니다.
1. 상호배제 : 한 프로세스가 사용하는 자원은 다른 프로세스와 공유할 수 없는 배타적인 자원이어야 합니다. 배타적인 자원은 임계구역으로 보호되기 때문에 다른 프로세스가 동시에 사용할 수 없습니다.
2. 비선점: 한 프로세스가 사용 중인 자원은 중간에 다른 프로세스가 빼앗을 수 없어야 합니다. 자원을 빼앗을 수 없으면 공유할 수도 없으므로 교착상태가 발생할 수 있습니다.
3. 점유와 대기 : 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 기다리는 상태여야 합니다. 교착상태가 되려면 다른 프로세스가 필요로 하는 자원을 점유하고 있으며 다른 자원을 기다리는 상태가 되어야 하기 때문이죠.
4. 원형 대기: 점유와 대기를 하는 프로세스 간의 관계가 원을 이루어야 합니다. 점유와 대기를 하는 프로세스들이 서로 방해하는 방향이 원이 되면, 프로세스들이 서로 양보하지 않기 때문에 교착상태에 빠지게 된다고 합니다.
이러한 교착 상태를 예방하기 위한 방법으로 3가지가 있습니다.
1. 교착 상태 예방 : 교착 상태를 유발하는 네 가지 조건이 발생하지 않도록 무력화 하는 방식입니다.
1-1. 상호 배제 예방 : 시스템 내에 있는 상호 배타적인 모든 자원, 즉 독점적으로 사용할 수 있는 자원을 없애버리는 방법입니다. 시스템 내의 모든 자원을 공유할 수 있다면 교착 상태가 발생하지 않겠죠. 그러나 현실적으로는 모든 자원을 공유할 수 없으며 상호 배제를 적용하여 보호해야 하는 자원이 있기 때문에 실용성이 떨어지는 방법입니다.
1-2. 비선점 예방 : 모든 자원을 빼앗을 수 있도록 만드는 방법입니다. 다만 이 방법은 어떤 기준으로 빼앗을지, 빼앗은 시간 중 얼마나 사용할지 결정하기 어렵고- 설사 우선순위를 기준으로 빼앗는다고 해도 우선 순위가 낮은 프로세스는 계속 실행이 되지 않을 확률이 있기 때문에 이 방법도 추천되지 않습니다.
1-3. 점유와 대기 예방 : 프로세스가 자원을 점유한 상태에서 다른 자원을 기다리지 못하게 하는 방법으로, 전부 할당하거나 할당하지 않는 방법을 사용하는 것입니다. 이 방법은 프로세스가 앞으로 사용할 자원까지 미리 선점해버리기 때문에 다른 프로세스의 작업이 진행되기 어렵습니다.
1-4. 원형 대기 예방: 점유와 대기를 하는 프로세스들이 원형을 이루지 못하도록 하는 방법으로, 자원을 한 방향으로만 사용하도록 하여 원형 대기를 예방합니다. 예컨대 모든 자원에 숫자를 부여하고, 숫자가 작은 자원이 숫자가 큰 자원을 잡는 것은 허용하지만, 숫자가 큰 자원을 잡은 상태에서 작은 자원을 점유함은 허용하지 못하게 하는 방식으로 진행하는 것이지요. 그러나 이 방식은 사용자 입장에서 납득하기 어려운 결과를 초래합니다. 예컨대 숫자 3이 부여된 프린터를 사용한 다음 숫자 1로 할당된 마우스를 사용하려하는 경우 운영체제에서 이를 거부하게 되죠.
다만 이 방식은 실효성이 적어 잘 사용되지 않는다고 합니다.
2. 교착 상태 회피 : 자원 할당량을 조절하여 교착 상태를 해결하는 방식입니다. 자원을 할당하다가 교착 상태를 유발할 가능성이 있다고 판단되면 자원 할당을 중단하고 지켜봅니다. 대표적으로 자원의 총 수와 현재 할당된 자원의 수를 기준으로 시스템을 안정 / 불안정 상태로 나누고 시스템이 안정 상태를 유지하도록 자원을 할당하는 은행원 알고리즘이 있습니다.
3. 교착 상태 검출과 회복: 자원 할당 그래프를 모니터링하면서 교착 상태가 발생하는지 살펴보는 방식입니다. 만약 교착상태가 발생하면 교착 상태 회복 단계가 진행됩니다.
'CS > Operating Systems' 카테고리의 다른 글
프로세스와 스레드의 차이 (0) | 2023.09.03 |
---|---|
동시성과 병렬성 (0) | 2023.09.01 |
프로세스 주소공간 (0) | 2021.08.18 |
프로세스와 스레드 (0) | 2021.08.13 |
운영체제 (0) | 2021.08.01 |