4-5. 데드락(Deadlock) 소개
1. 데드락(Deadlock)의 이해
데드락은 두 개 이상의 프로세스가 서로 자원을 점유한 채, 다른 프로세스가 점유한 자원을 기다리면서 무한정 블록 상태에 빠지는 현상을 의미합니다. 마치 두 사람이 서로의 목을 붙잡고 놓지 않아 아무도 움직일 수 없는 상황과 같습니다. 운영체제에서 데드락은 시스템의 자원 활용률을 극도로 저하시키고, 결국 시스템 전체의 마비를 초래할 수 있는 심각한 문제입니다.
1) 데드락의 배경
운영체제는 CPU, 메모리, I/O 장치 등 다양한 자원을 관리하며, 여러 프로세스들이 이러한 자원을 공유하여 작업을 수행합니다. 자원 공유는 시스템의 효율성을 높이는 데 기여하지만, 동시에 경쟁과 충돌의 가능성을 내포합니다. 특히, 프로세스들이 자원을 획득하고 반납하는 과정에서 잘못된 설계나 관리로 인해 데드락이 발생할 수 있습니다.
2) 데드락의 비유
데드락을 이해하기 위한 재미있는 비유를 들어보겠습니다. 식사 중인 두 사람이 있다고 가정해 봅시다. 각자는 포크와 나이프를 하나씩 가지고 있으며, 포크로는 음식을 찍어 먹고 나이프로는 음식을 자릅니다.
- 사람 A는 포크를 잡고 나이프를 기다리고 있습니다.
- 사람 B는 나이프를 잡고 포크를 기다리고 있습니다.
이 경우, 두 사람은 서로가 가진 자원(포크와 나이프)을 기다리며 영원히 식사를 할 수 없게 됩니다. 이것이 데드락의 간단한 예시입니다.
2. 데드락 발생 조건
데드락은 특정 조건들이 동시에 만족될 때 발생합니다. 이러한 조건들을 이해하는 것은 데드락을 예방하고 해결하는 데 중요한 첫걸음입니다. 데드락 발생에 필요한 4가지 조건은 다음과 같습니다.
- 상호 배제(Mutual Exclusion): 자원은 한 번에 하나의 프로세스만 사용할 수 있습니다. 다른 프로세스가 자원을 사용 중이면, 해당 자원을 요청하는 다른 프로세스는 기다려야 합니다.
- 점유 대기(Hold and Wait): 프로세스가 자원을 최소한 하나 점유한 상태에서, 다른 자원을 얻기 위해 대기합니다. 즉, 이미 자원을 가지고 있으면서 다른 자원을 요청하는 상황입니다.
- 비선점(No Preemption): 이미 할당된 자원은 다른 프로세스가 강제로 빼앗을 수 없습니다. 자원은 해당 자원을 소유한 프로세스가 스스로 반납할 때만 해제됩니다.
- 순환 대기(Circular Wait): 프로세스들의 자원 요청이 순환 고리를 형성합니다. 예를 들어, 프로세스 A는 프로세스 B가 가진 자원을 요청하고, 프로세스 B는 프로세스 C가 가진 자원을 요청하며, 프로세스 C는 프로세스 A가 가진 자원을 요청하는 상황입니다.
이 4가지 조건 중 어느 하나라도 만족되지 않으면 데드락은 발생하지 않습니다.

3. 데드락 해결 방법
데드락을 해결하기 위한 다양한 방법들이 존재합니다. 각각의 방법은 장단점을 가지고 있으며, 시스템의 특성과 요구사항에 따라 적절한 방법을 선택해야 합니다.
1) 데드락 예방 (Deadlock Prevention)
데드락 예방은 데드락 발생 조건 중 하나 이상을 제거하여 데드락을 방지하는 방법입니다.
- 상호 배제 조건 제거: 공유 가능한 자원을 사용합니다. (프린터와 같은 자원은 상호 배제가 필수적이므로 이 방법은 적용하기 어렵습니다.)
- 점유 대기 조건 제거: 프로세스가 모든 필요한 자원을 한 번에 요청하도록 하거나, 어떤 자원도 가지고 있지 않은 상태에서 자원을 요청하도록 합니다. 이 방법은 자원 활용 효율을 떨어뜨릴 수 있습니다.
- 비선점 조건 제거: 자원을 빼앗을 수 있도록 합니다. 프로세스가 자원을 요청할 때 사용할 수 없으면, 현재 가지고 있는 자원을 반납하고 다시 요청하게 합니다. 하지만, 자원 반납과 재요청 과정에서 작업의 진행이 방해받을 수 있습니다.
- 순환 대기 조건 제거: 자원에 대한 요청 순서를 정하여 순환 고리가 형성되지 않도록 합니다. 예를 들어, 모든 자원에 번호를 매기고, 프로세스가 자원을 요청할 때는 오름차순으로만 요청하도록 제한합니다.
2) 데드락 회피 (Deadlock Avoidance)
데드락 회피는 시스템의 상태를 면밀히 분석하여 데드락이 발생할 가능성이 있는 자원 할당을 피하는 방법입니다. 일반적으로 '은행원 알고리즘'과 같은 안전성 알고리즘을 사용합니다. 시스템은 자원을 할당하기 전에, 그 할당이 안전 상태(데드락이 발생하지 않을 가능성이 있는 상태)를 유지하는지 확인합니다.
- 안전 상태: 시스템 내 모든 프로세스가 데드락 없이 작업을 완료할 수 있는 상태를 의미합니다.
- 불안전 상태: 데드락이 발생할 가능성이 있는 상태입니다. 불안전 상태라고 해서 반드시 데드락이 발생하는 것은 아니지만, 데드락으로 이어질 수 있는 위험이 있습니다.

3) 데드락 감지 및 복구 (Deadlock Detection and Recovery)
데드락 감지는 데드락 발생을 허용한 후, 데드락을 감지하고 해결하는 방법입니다.
- 데드락 감지: 시스템은 데드락 발생을 주기적으로 감지합니다. 자원 할당 그래프(Resource Allocation Graph)를 사용하여 데드락을 감지할 수 있습니다. 자원 할당 그래프는 프로세스와 자원을 노드로, 자원 요청과 할당을 간선으로 표현합니다. 사이클이 존재하면 데드락이 발생했음을 의미합니다.
- 데드락 복구: 데드락이 감지되면, 시스템은 데드락을 해결하기 위한 조치를 취합니다. 일반적으로 다음 방법 중 하나를 사용합니다.
- 프로세스 강제 종료: 데드락에 연루된 프로세스 중 하나 이상을 강제로 종료합니다. 종료할 프로세스를 선택하는 데 여러 전략이 사용될 수 있습니다 (우선순위, 실행 시간, 자원 사용량 등).
- 자원 선점: 데드락에 연루된 프로세스 중 하나로부터 자원을 빼앗아 다른 프로세스에게 할당합니다. 자원을 빼앗을 프로세스를 선택하고, 빼앗긴 자원을 어떻게 처리할지 결정해야 합니다.
4) 데드락 무시 (Deadlock Ignorance)
데드락 무시는 데드락을 해결하기 위한 어떠한 조치도 취하지 않는 방법입니다. 데드락 발생 가능성이 낮거나, 데드락 해결에 드는 비용이 너무 큰 경우에 사용될 수 있습니다. 운영체제가 데드락을 감지하거나 해결하지 않고, 사용자가 시스템을 재시작하도록 하는 경우가 이에 해당합니다.
4. 데드락의 실제 사례
데드락은 다양한 운영체제와 시스템에서 발생할 수 있습니다. 몇 가지 실제 사례를 통해 데드락의 심각성을 이해할 수 있습니다.
- 데이터베이스 시스템: 두 개의 트랜잭션이 서로의 테이블을 잠그고, 상대방의 잠금이 해제되기를 기다리는 상황.
- 분산 시스템: 여러 서버가 서로의 자원을 요청하고, 각 서버가 다른 서버의 자원 해제를 기다리는 상황.
- 멀티 스레드 애플리케이션: 두 개의 스레드가 서로의
mutex를 획득하려고 하면서 교착 상태에 빠지는 상황.
5. 데드락 관련 주의사항
데드락은 시스템의 안정성과 성능에 치명적인 영향을 미칠 수 있으므로, 데드락을 예방하고 해결하기 위한 노력이 중요합니다.
- 자원 할당 설계의 중요성: 시스템 설계 단계에서 자원 할당 방식을 신중하게 고려해야 합니다. 자원의 효율적인 사용과 데드락 예방 사이의 균형을 맞추는 것이 중요합니다.
- 테스팅과 모니터링: 시스템을 구축한 후에는 데드락 발생 가능성을 테스트하고, 시스템의 동작을 지속적으로 모니터링해야 합니다.
- 예외 처리와 오류 복구 메커니즘: 데드락이 발생했을 때 시스템이 정상적으로 복구될 수 있도록 예외 처리와 오류 복구 메커니즘을 구현해야 합니다.
- 코드 리뷰와 안전한 코딩 습관: 동기화 관련 코드를 작성할 때는 코드 리뷰를 통해 잠재적인 데드락 위험을 파악하고, 안전한 코딩 습관을 유지해야 합니다.
6. 결론
데드락은 운영체제에서 발생하는 심각한 문제로, 시스템의 자원 활용을 저하시키고 전체 시스템의 마비를 초래할 수 있습니다. 데드락의 정의, 발생 조건, 해결 방법을 정확히 이해하고, 시스템 설계 및 구현 단계에서 데드락 예방을 위한 노력을 기울여야 합니다. 데드락은 발생하기 전에 예방하는 것이 가장 좋지만, 불가피하게 발생할 경우 신속하게 감지하고 복구할 수 있는 메커니즘을 마련하는 것이 중요합니다.
비슷한 글 추천
4-6. 데드락 예방, 회피, 감지
데드락 예방, 회피, 감지 기법들을 자세히 설명하고, 각 기법의 장단점을 비교합니다.
4-2. 임계 구역(Critical Section)
임계 구역의 개념과 해결 방법을 설명하고, 상호 배제(Mutual Exclusion)의 중요성을 강조합니다.
4-3. 락(Lock) & 뮤텍스(Mutex)
락과 뮤텍스의 개념, 동작 방식, 구현 방법을 설명합니다. 세마포어와의 차이점을 비교합니다.
4-1. 동기화 문제 소개
동기화 문제의 필요성과 중요성을 설명하고, 경쟁 조건(Race Condition)의 개념을 소개합니다.
Comments (0)
No comments yet. Be the first to comment!
Please to write a comment.