본문 바로가기
카테고리 없음

프로세스의 무한 대기, 교착상태 (Deadlock) 완벽 가이드

by IT꿀토리 2024. 12. 28.

운영체제(OS, Operating System)는 멀티 프로세스 환경에서 여러 프로세스가 효율적인 자원 공유 및 협력할 수 있도록 관리합니다. 그러나 자원을 공유하는 과정에서 발생할 수 있는 대표적인 문제 중 하나가 바로 교착상태(Deadlock)입니다. 교착상태는 프로세스들이 서로 자원을 기다리며 무한히 정체되는 상황을 의미합니다. 이번 글에서는 교착상태의 정의, 발생 조건, 원인, 그리고 이를 해결하거나 방지하기 위한 방법에 대해 알아보겠습니다.


1. 교착상태(Deadlock)란?

교착상태는 두 개 이상의 프로세스가 서로 자원을 점유한 채 다른 프로세스가 점유한 자원을 요청하면서 무한히 대기하는 상태를 말합니다. 예를 들어, 프로세스 A가 자원 X를 점유하고 자원 Y를 기다리고 있으며, 동시에 프로세스 B는 자원 Y를 점유하고 자원 X를 기다리는 경우, 두 프로세스는 계속해서 대기 상태에 빠지게 됩니다. 이는 시스템 전체의 동작이 멈추게 만드는 심각한 문제로 이어질 수 있습니다.

 

2. 교착상태의 발생 조건 (원인)

교착상태가 발생하려면 다음 네 가지 조건이 동시에 충족되어야 합니다. 이를 코프만(Coffman)조건이라고도 합니다.

상호 배제
(Mutual Exclusion)
자원이 한 번에 하나의 프로세스만 사용할 수 있어야 합니다. 즉, 자원을 점유 중인 프로세스가 해제하기 전까지 다른 프로세스는 그 자원을 사용할 수 없습니다.
점유 대기
(Hold and Wait)
프로세스가 이미 점유하고 있는 자원을 유지한 상태에서 다른 자원을 추가로 요청하며 대기해야 합니다.
비선점
(No Preemption)
다른 프로세스가 점유 중인 자원을 강제로 빼앗을 수 없어야 합니다. 자원은 점유 중인 프로세스가 스스로 해제할 때만 사용할 수 있습니다.
순환 대기
(Circular Wait)
대기 상태에 있는 프로세스들이 순환 형태로 자원을 요청해야 합니다. 예를 들어, 프로세스 A는 프로세스 B가 점유한 자원을, B는 프로세스 C가 점유한 자원을, C는 프로세스 A가 점유한 자원을 요청하는 상태입니다.

 

 

 

4. 교착상태 해결 및 방지 방법

교착상태를 해결하거나 방지하기 위해 운영체제는 다양한 전략을 사용합니다. 이를 크게 네 가지로 나눌 수 있습니다.

예방
(Prevention)

교착상태의 발생 조건 중 하나 이상을 제거하여 문제를 사전에 방지합니다.
  • 상호 배제 제거: 자원을 공유 가능한 형태로 변경합니다. (예: 읽기 전용 자원)
  • 점유 대기 방지: 프로세스가 자원을 요청하기 전에 필요한 모든 자원을 확보하도록 강제합니다.
  • 비선점 제거: 점유 중인 자원을 강제로 해제할 수 있도록 설계합니다.
  • 순환 대기 방지: 자원에 우선순위를 설정하고, 항상 우선순위가 높은 자원부터 요청하도록 합니다.

회피
(Avoidance)

자원의 상태를 지속적으로 추적하여 교착상태가 발생할 가능성이 있는 요청을 허용하지 않습니다.
  • 대표적인 알고리즘: 은행원 알고리즘(Banker's Algorithm)
    프로세스가 자원을 요청할 때, 요청을 승인하면 교착상태가 발생하지 않는지 미리 확인합니다.

탐지
(Detection)

교착상태가 발생했는지 주기적으로 점검하고, 이를 해결하기 위한 조치를 취합니다.
  • 탐지 알고리즘: 자원의 상태와 프로세스의 요청 정보를 기반으로 교착 상태를 탐지합니다.
  • 해결 방법: 교착상태에 있는 프로세스를 강제로 종료하거나 점유 중인 자원을 해제합니다.

복구
(Recovery)

교착상태가 발생한 이후, 시스템을 정상 상태로 복구합니다.
  • 프로세스 종료: 교착상태를 유발하는 프로세스를 하나씩 종료합니다.
  • 자원 선점: 프로세스에서 점유 중인 자원을 강제로 회수하여 다른 프로세스에 할당합니다.

 

5. 결론

교착상태는 운영체제에서 자원을 효율적으로 관리하는 데 있어 중요한 문제입니다. 이를 예방하거나 해결하기 위한 방법은 시스템의 성능과 안정성을 유지하는 데 필수적입니다. 운영체제 설계자는 교착상태를 미리 방지하거나 빠르게 탐지하고 복구할 수 있는 적절한 전략을 구현해야 합니다.

교착상태를 이해하고 이를 관리하는 방법을 익히면 운영체제뿐만 아니라 멀티 프로세스 애플리케이션 개발에서도 큰 도움을 받을 수 있습니다. 이를 통해 시스템이 안정적으로 작동하도록 설계하는 데 필요한 통찰을 얻을 수 있을 것입니다.