교착 상태
운영체제 : 교착 상태(Deadlock)의 이해와 해결
1. Executive Summary: 교착 상태 핵심 요약
목적과 핵심 요약
이 브리핑은 운영체제(OS) 환경에서 발생하는 핵심적인 문제 중 하나인 교착 상태(Deadlock) 의 개념을 명확히 정의하고,
발생 조건과 다양한 해결 방안을 체계적으로 설명하는 것을 목적으로 합니다. 교착 상태란 둘 이상의 프로세스가 서로 상대방이 점유한 자원을 무한정 기다리며 작업이 중단되는 현상을 의미합니다.
이러한 문제를 해결하기 위해,
교착 상태의 발생 조건 자체를 원천적으로 차단하는 예방(Prevention), 자원 할당 시 위험성을 사전에 검사하는 회피(Avoidance),
그리고 교착 상태 발생을 허용한 뒤 사후에 조치하는 검출 및 회복(Detection & Recovery) 전략이 사용됩니다.
일상 속 예시를 통한 개념 설명
교착 상태는 '양보 없는 일방통행 다리'의 상황으로 쉽게 이해할 수 있습니다.
다리의 각 구간을 시스템 '자원'으로, 다리를 건너는 차량을 '프로세스'로 비유해 보겠습니다.
양쪽에서 동시에 진입한 차량들이 다리 한가 운데서 마주치면, 어느 쪽도 앞으로 나아갈 수 없는 상태가 됩니다.
각 차량은 상대방이 길을 비켜주기(자원을 놓아주기)만을 기다리며 꼼짝도 할 수 없습니다.
이 상황이 바로 교착 상태입니다. 이 문제를 해결하기 위해서는 외부의 개입, 즉 한쪽 차량이 후진(자원 해제 및 양보)하여 길을 터주는 것 외에는 다른 방법이 없습니다.
2. 교착 상태(Deadlock)의 정의와 기본 개념
다중 프로그래밍 환경에서 여러 프로세스가 한정된 자원을 공유하는 것은 필연적이며, 이 과정에서 교착 상태는 시스템의 성능과 안정성을 심각하게 저해하는 문제로 이어질 수 있습니다.
따라서 교착 상태의 공식적인 정의를 이해하고, 유사하지만 다른 개념인 기아 상태(Starvation) 와의 차이점을 명확히 구분하는 것은 문제 해결의 첫걸음입니다.
교착 상태의 공식 정의
교착 상태(Deadlock)는 둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 상태로 정의됩니다.
이 현상은 단순히 시스템 자원(예: CPU, 메모리) 할당뿐만 아니라, 공유 데이터에 대한 동 시 접근을 제어하는 잠금(lock) 메커니즘, 데이터베이스 트랜잭션과 같은 다양한 응용 프로그램 환경에서도 발생할 수 있습니다.
교착 상태와 기아 상태 비교 분석
교착 상태는 종종 기아 상태와 혼동되지만, 두 현상은 원인과 상태 진행, 해결 방법에서 뚜렷한 차이를 보입니다.
| 구분 | 교착 상태 (Deadlock) | 기아 상태 (Starvation) |
|---|---|---|
| 개념 및 원인 | 프로세스들이 서로가 점유한 리소스를 순환적으로 대기하며 발생합니다. | 특정 프로세스가 자원에 대한 우선순위가 낮거나 스케줄링 정책의 문제로 인해 자원에 계속 접근하지 못하고 대기하는 상황입니다. |
| 상태 진행 | 관련된 모든 프로세스가 아무런 진전을 보이지 못하고 시스템 전체가 멈출 수 있습니다. | 다른 프로세스들은 정상적으로 계속 진행될 수 있으며, 특정 프로세스만 작업을 수행하지 못합니다. |
| 해결 방법 | 외부의 개입을 통해 프로세스를 강제 종료하거나 자원을 강제로 해제해야 해결 가능합니다. | 우선순위 동적 조정(e.g., 에이징) 등 공정한 스케줄링 정책을 적용하여 모든 프로세스가 자원을 할당받을 기회를 갖도록 조정하여 해결할 수 있습니다. |
3. 교착 상태의 발생 조건 분석
교착 상태는 우연히 발생하는 현상이 아니라, 아래에 설명할 네 가지 특정 조건이 모두 동시에 충족될 때만 발생하는 필연적인 결과입니다. 따라서 이 네 가지 필요조건을 정확히 이해하는 것은 교착 상태를 예방하고, 진단하며, 해결하는 모든 전략의 근본적인 기초가 됩니다.
네 가지 필요조건 (Necessary Conditions)
교착 상태가 발생하기 위해서는 아래의 네 가지 조건이 반드시 동시에 성립해야 합니다. 이 중 단 하나라도 충족되지 않으면 교착 상태는 발생하지 않습니다.
- 상호 배제 (Mutual Exclusion) 자원은 한 번에 오직 하나의 프로세스만 사용할 수 있어야 합니다. 즉, 공유가 불가능한 배타적인 자원이어야 합니다.
- 점유와 대기 (Hold and Wait) 프로세스가 최소한 하나 이상의 자원을 점유하고 있는 상태에서, 다른 프로세스에 할당된 자원을 추가로 요청하며 대기할 수 있어야 합니다.
- 비선점 (Non-preemption) 한 프로세스에 할당된 자원은 사용이 끝날 때까지 다른 프로세스가 강제로 빼앗을 수 없어야 합니다. 자원의 반납은 오직 점유한 프로세스 자신만이 할 수 있습니다.
- 원형 대기 (Circular Wait) 자원을 기다리는 프로세스들 간에 순환적인 사슬이 형성되어야 합니다. 즉, 프로세스 P0는 P1이 가진 자원을, P1은 P2가 가진 자원을, ..., Pn은 P0가 가진 자원을 기다리는 원형의 대기열이 존재해야 합니다.
사례 연구: 식사하는 철학자 문제
'식사하는 철학자 문제(The Dining Philosophers Problem)'는 위 네 가지 조건이 어떻게 교착 상태를 유발하는지 보여주는 고전적인 예시입니다. 원형 식탁에 앉은 철학자들이 식사를 하기 위해서는 자신의 왼쪽과 오른쪽 포크를 모두 집어야 합니다.
이 문제에 네 가지 조건을 대입해 보면 다음과 같습니다.
- 상호 배제: 하나의 포크는 동시에 한 명의 철학자만 사용할 수 있습니다.
- 점유와 대기: 각 철학자는 자신의 왼쪽 포크를 집은 상태에서, 오른쪽 포크를 사용할 수 있을 때까지 기다립니다.
- 비선점: 옆 사람이 사용 중인 포크를 강제로 빼앗을 수 없습니다.
- 원형 대기: 만약 모든 철학자가 동시에 자신의 왼쪽 포크를 집는다면, 각 철학자는 자신의 오른쪽에 앉은 철학자가 왼쪽 포크(즉, 자신의 오른쪽 포크)를 놓기만을 기다리는 원형의 대기열이 형성되어 아무도 식사를 시작하지 못하는 교착 상태에 빠지게 됩니다.