교착 상태(Deadlock)가 발생하려면 시스템에 다음 네 가지 조건이 동시에 만족되어야 합니다. 각 조건을 이해하기 쉽게 설명하겠습니다.
상호 배제 (Mutual Exclusion)
• 설명: 자원을 하나의 프로세스만 사용할 수 있어야 합니다. 즉, 특정 자원이 한 프로세스에 의해 점유된 동안에는 다른 프로세스가 이 자원을 사용할 수 없습니다.
• 예: 프린터와 같은 자원이 하나뿐인 경우, 한 프로세스가 프린터를 사용 중일 때 다른 프로세스는 이를 기다려야 합니다.
점유와 대기 (Hold and Wait)
• 설명: 프로세스가 적어도 하나의 자원을 점유하고 있으면서 다른 자원을 추가로 요청할 때, 이미 점유한 자원을 놓지 않고 대기 상태로 있습니다.
• 예: 프로세스 A가 자원 X를 점유한 상태에서 자원 Y가 필요해 대기하고 있고, 동시에 다른 프로세스 B가 자원 Y를 점유한 상태에서 자원 X를 필요로 하는 상황입니다.
비선점 (No Preemption)
• 설명: 프로세스가 자원을 강제로 빼앗기지 않습니다. 즉, 다른 프로세스가 자원을 필요로 할 경우 점유 중인 프로세스가 자발적으로 해제할 때까지 기다려야 합니다.
• 예: CPU처럼 사용 중인 자원을 다른 프로세스가 강제로 가져갈 수 없습니다. 프로세스가 자원을 해제할 때까지 다른 프로세스는 기다려야 합니다.
환형 대기 (Circular Wait)
• 설명: 프로세스들이 원형 형태로 자원을 기다리는 상황입니다. 예를 들어, 프로세스 A가 자원 X를 기다리고, 프로세스 B가 자원 Y를 기다리며, 마지막 프로세스가 처음 프로세스의 자원을 기다리는 상태가 발생합니다.
• 예: 프로세스 A는 B의 자원을 기다리고, B는 C의 자원을 기다리며, C는 다시 A의 자원을 기다리는 순환 관계가 형성되어 서로의 자원을 기다리는 무한 대기 상태가 됩니다.
이 네 가지 조건이 모두 만족될 때 교착 상태가 발생합니다. 교착 상태를 방지하려면 이 조건 중 하나라도 만족하지 않도록 제어해야 하며, 이러한 조건을 충족하지 않도록 다양한 회피 및 방지 기법을 사용합니다.
교착 상태를 방지하고 해결하기 위한 방법은 크게 예방(Prevention), 회피(Avoidance), 복구(Recovery) 세 가지로 나눌 수 있습니다. 각 방법의 개념과 구체적인 기법을 쉽게 설명하겠습니다.
예방 (Prevention)
• 개념: 교착 상태를 유발하는 네 가지 필요조건이 동시에 만족되지 않도록 제어하여 교착 상태가 발생할 수 없게 하는 방법입니다.
• 방법:
• 상호 배제(Mutual Exclusion) 조건 제거: 모든 자원을 여러 프로세스가 동시에 사용할 수 있도록 하는 방법입니다. 그러나 자원을 공유하기 어려운 상황도 많아 실제로는 제한적입니다.
• 점유와 대기(Hold and Wait) 조건 제거: 자원을 사용하려는 프로세스가 필요한 모든 자원을 처음부터 할당받도록 합니다. 하지만 이 방법은 자원을 오랫동안 비효율적으로 사용하게 될 위험이 있습니다.
• 비선점(No Preemption) 조건 제거: 자원을 점유한 프로세스가 대기 상태에 들어가면 자원을 강제로 회수해 다른 프로세스가 사용하도록 합니다. 이 방법은 자원의 강제 회수를 통해 교착 상태를 방지하지만, 일부 자원은 강제 회수가 어려울 수 있습니다.
• 환형 대기(Circular Wait) 조건 제거: 모든 자원에 번호를 부여하여 프로세스가 자원을 요청할 때 항상 번호가 큰 자원부터 요청하도록 제한합니다. 이 방법은 자원을 순차적으로 할당하여 교착 상태가 발생하지 않게 합니다.
• 예시 기법:
• 세마포어(Semaphore): 프로세스들이 자원을 동기화하며 상호 배제를 유지하도록 제어하여 교착 상태를 예방합니다.
회피 (Avoidance)
• 개념: 교착 상태가 발생할 가능성이 있는 상황을 예측하여, 교착 상태가 발생할 수 있는 자원 할당은 피하는 방식입니다.
• 방법:
• 프로세스가 자원을 요청할 때, 현재 시스템 상태와 자원 요청을 분석하여 교착 상태 발생 가능성이 있는지 판단합니다.
• 교착 상태가 발생할 가능성이 있으면 자원을 할당하지 않고 대기하게 합니다.
• 예시 기법:
• 은행원 알고리즘(Banker’s Algorithm): 시스템에 남아있는 자원이 모든 프로세스의 최종 요구량을 충족할 수 있는지 확인한 뒤 자원을 할당합니다. 자원을 할당했을 때 모든 프로세스가 최종적으로 자원을 해제할 수 있다면 안정 상태(Safe State)로 판단해 할당하고, 그렇지 않으면 자원 할당을 거부합니다.
복구 (Recovery)
• 개념: 교착 상태가 이미 발생한 상황에서 이를 해결하는 방법입니다.
• 방법:
• 교착 상태 감지: 주기적으로 시스템을 확인하여 교착 상태가 발생했는지 탐지합니다.
• 교착 상태 해결: 교착 상태에 있는 프로세스들을 종료시키거나 자원을 회수해 교착 상태에서 벗어납니다.
• 예시 기법:
• 자원 할당 그래프(Resource Allocation Graph): 프로세스와 자원의 관계를 그래프로 표현해 교착 상태를 시각적으로 확인합니다. 이 그래프에서 순환이 발견되면 교착 상태로 판단하고 복구 작업을 시작합니다.
• 자원 강제 회수(Preemption): 자원을 점유 중인 프로세스를 강제로 중단시키고, 다른 프로세스가 자원을 사용할 수 있게 합니다. 필요에 따라 교착 상태에 있는 일부 프로세스를 강제로 종료하여 자원을 해제하기도 합니다.
요약
• 예방(Prevention): 교착 상태를 발생시키는 네 가지 조건이 동시에 만족되지 않도록 제어합니다. 세마포어 등이 사용됩니다.
• 회피(Avoidance): 자원 할당 시 교착 상태 가능성을 분석하고, 교착 상태 발생 위험이 있을 때 자원 할당을 회피합니다. 은행원 알고리즘이 대표적입니다.
• 복구(Recovery): 이미 발생한 교착 상태를 해결합니다. 자원 할당 그래프를 통해 상태를 확인하고, 자원 강제 회수 등을 통해 교착 상태를 해소합니다.
이 세 가지 방법을 적절히 활용하면 교착 상태 발생을 예방하거나 해결할 수 있습니다.