본문 바로가기

전산학에서 교착 상태(데드락)란 무엇인가: 서로 양보하지 않는 프로그램들이 멈춰버리는 상황

📑 목차

    전산학에서 교착 상태는 “서로를 기다리다 영원히 멈추는” 대표적인 실패 패턴이다

    전산학 관점에서 컴퓨터가 멈춘다는 말은 단순히 화면이 멈추는 현상만을 의미하지 않는다. 전산학에서는 CPU가 일을 하고 있어도, 프로그램이 정상적으로 진행되지 못하고 특정 지점에서 계속 대기하는 상태를 중요한 문제로 다룬다. 그중에서도 전산학 교재에 반복해서 등장하는 개념이 교착 상태(데드락, deadlock)이다.
    전산학에서 교착 상태는 여러 프로그램(또는 스레드)이 동시에 실행되는 환경에서, 서로가 가진 자원을 기다리며 영원히 진행이 멈추는 상황을 말한다. 실무에서는 데이터베이스 트랜잭션, 파일 잠금, 멀티스레드 프로그램, 서버의 동시성 처리에서 교착 상태가 실제 장애로 이어지기도 한다.
    이 글은 전산학 입문자도 이해할 수 있도록 전산학 교착 상태, 전산학 동시성, 전산학 자원(resource), 전산학 락(lock), 전산학 교착 상태 조건을 중심으로, 교착 상태의 원리와 예시, 예방과 해결 전략까지 한 번에 정리한다.

     

    전산학 교착 상태의 개념과 기본 원리, 관련 용어 정리

    1) 전산학에서 교착 상태(데드락)의 정의는 무엇인가

    전산학에서 교착 상태는 다음과 같이 설명할 수 있다.
    여러 실행 단위(프로세스 또는 스레드)가 서로가 점유한 자원을 요구하면서, 어느 누구도 자원을 놓지 않아 모두가 무한 대기에 빠진 상태다.
    전산학적으로 중요한 점은 “느려진 것”이 아니라 “진행이 불가능해진 것”이다. 즉, CPU 사용률이 낮아도 서비스는 멈춘 것처럼 보일 수 있다.

    2) 전산학에서 말하는 자원(resource)과 락(lock)

    전산학에서 교착 상태를 이해하기 위해서는 자원과 락이라는 개념이 필요하다.

    • 자원(resource): 프로그램이 사용해야 하는 공유 대상이다. 예를 들어 파일, 메모리 영역, 데이터베이스 레코드, 프린터 같은 장치, 네트워크 소켓 등이 자원이 될 수 있다.
    • 락(lock): 동시에 접근하면 문제가 생길 수 있는 자원을 보호하기 위해, 한 번에 한 실행 단위만 접근하도록 잠그는 장치다. 락은 전산학의 동시성 제어의 핵심 도구다.

    락은 전산학에서 안전성을 높이지만, 잘못 사용하면 교착 상태를 만든다. 전산학에서 교착 상태가 중요한 이유가 여기에 있다.

    3) 전산학 교착 상태의 4가지 필요 조건(코프만 조건)

    전산학에서는 교착 상태가 성립하려면 보통 4가지 조건이 동시에 만족되어야 한다고 설명한다. 이를 코프만(Coffman) 조건이라고 부르는 경우가 많다.

    1. 상호 배제(Mutual Exclusion): 자원은 한 번에 하나만 사용할 수 있다.
    2. 점유와 대기(Hold and Wait): 자원을 가진 상태에서 다른 자원을 추가로 기다린다.
    3. 비선점(No Preemption): 누군가 가진 자원을 강제로 뺏을 수 없다.
    4. 환형 대기(Circular Wait): A는 B를, B는 C를, C는 A를 기다리는 식의 순환이 존재한다.

    전산학적으로 중요한 관점은 “이 4가지 중 하나라도 깨면 교착 상태는 성립하지 않는다”는 점이다. 따라서 전산학에서 교착 상태 해결 전략은 “이 조건을 어떻게 깨는가”로 정리된다.

     

    전산학에서 교착 상태(데드락)란 무엇인가: 서로 양보하지 않는 프로그램들이 멈춰버리는 상황
    전산학 교착 상태의 환형 대기 구조(A→B→C→A)

    4) 전산학에서 교착 상태와 기아(starvation), 라이브락(livelock)의 차이

    전산학 입문자에게 교착 상태는 비슷한 용어들과 혼동되기 쉽다. 하지만 의미가 다르다.

    • 교착 상태(Deadlock): 모두가 멈춰 있고, 스스로 풀 수 없다.
    • 기아(Starvation): 어떤 작업이 계속 우선순위에서 밀려 기회를 못 받는다. 시스템은 돌아가지만 특정 작업은 진행이 어렵다.
    • 라이브락(Livelock): 멈춘 것은 아니지만 서로 양보만 하느라 실제 진전이 없다. 움직이는데도 일이 끝나지 않는다.

    전산학에서는 이 셋을 구분하는 것이 실무 문제 해결에도 도움이 된다.

     

    전산학 교착 상태의 실제 사례, 예방 전략, 해결 흐름

    1) 전산학 교착 상태가 발생하는 가장 흔한 패턴: 락 획득 순서 불일치

    교착 상태의 대표적인 실무 패턴은 “락을 잡는 순서가 서로 다른 경우”다. 예를 들어 다음과 같은 상황이다.

    • 스레드 1: A 자원을 잠그고(B를 기다림)
    • 스레드 2: B 자원을 잠그고(A를 기다림)

    서로가 가진 락을 기다리며 진행이 멈춘다. 전산학에서 교착 상태 예시로 가장 자주 등장하는 형태다.

    일상적 비유(과장 없는 수준)

    전산학 교착 상태는 좁은 복도에서 두 사람이 서로 양보하지 않고 마주 선 상황과 비슷하다. 한 사람은 “내가 먼저 지나가야 한다”라고 생각하고, 다른 사람도 같은 생각을 한다. 어느 쪽도 뒤로 물러서지 않으면 둘 다 앞으로 갈 수 없다.
    다만 전산학에서는 “양보”라는 행동 자체가 코드로 정의되어야 하므로, 규칙이 없으면 영원히 멈춘다.

    2) 전산학 교착 상태 예방: 4조건 중 하나를 의도적으로 깨는 방법

    전산학에서 교착 상태 예방은 코프만 조건 중 하나를 깨는 방식으로 설명한다.

    (1) 환형 대기 깨기: 락 획득 순서 통일

    가장 실용적인 전산학 전략은 락 획득 순서를 전역 규칙으로 정하는 것이다.
    예를 들어 “항상 A 락을 먼저 잡고 그 다음 B 락을 잡는다”라는 규칙을 모든 코드가 지키게 한다. 그러면 A를 잡은 뒤 B를 기다리는 상황은 있어도, 반대로 B를 잡은 뒤 A를 기다리는 순환이 사라진다.

    (2) 점유와 대기 깨기: 한 번에 필요한 락을 모두 획득하거나, 실패 시 모두 반납

    필요한 자원을 조금씩 잡아가며 기다리는 방식이 교착 상태를 만들기 쉽다.
    전산학에서는 “필요한 락을 한 번에 획득 시도하고, 하나라도 실패하면 모두 풀고 다시 시도” 같은 정책으로 점유와 대기 조건을 약화시킬 수 있다.

    (3) 비선점 깨기: 타임아웃과 강제 해제 전략

    전산학 실무에서는 락을 영원히 기다리지 않도록 타임아웃(timeout)을 둔다. 일정 시간 내에 락 획득에 실패하면 작업을 중단하고 롤백하거나 재시도한다.
    이 방식은 교착 상태를 “예방”이라기보다 “빠르게 회복”하는 전략에 가깝지만, 결과적으로 무한 대기를 막는다.

    (4) 상호 배제 깨기: 공유 자원을 줄이거나, 락이 필요 없는 구조로 변경

    상호 배제를 깨는 것은 가장 어렵지만, 가장 근본적인 전산학 해결이다. 예를 들어 읽기 작업은 공유 락, 쓰기 작업만 배타 락을 쓰는 방식(읽기-쓰기 락)으로 완화할 수 있다. 또는 메시지 큐 기반으로 변경해 공유 메모리 접근 자체를 줄일 수도 있다.

     

    교착 상태를 예방하는 락 순서 통일, 탐지하는 대기 그래프/타임아웃, 복구하는 롤백/강제 종료를 전산학 관점에서 단계별로 정리한 다이어그램
    전산학 교착 상태 대응 3단계(예방→탐지→복구)와 대표 기법

    3) 전산학 교착 상태 탐지: 실제로는 “증상”으로 먼저 보인다

    실무에서 전산학 교착 상태는 보통 다음 증상으로 발견된다.

    • 특정 요청이 끝나지 않고 계속 대기한다.
    • CPU 사용률은 낮은데, 응답은 멈춘 것처럼 느껴진다.
    • 로그에 “락 대기”, “트랜잭션 대기”, “timeout” 관련 메시지가 늘어난다.
    • 동시에 처리량이 급격히 떨어진다.

    전산학적으로 교착 상태는 내부 그래프 분석(대기 그래프)으로 탐지할 수 있다. 하지만 입문자 관점에서는 “락을 기다리는 요청이 서로 물려 있다”라는 구조만 이해해도 문제 분석이 쉬워진다.

    4) 전산학 교착 상태 복구: 시스템이 강제로 순환을 끊어야 한다

    교착 상태는 스스로 풀리지 않는 경우가 많다. 그래서 복구는 보통 다음 방식으로 이루어진다.

    • 특정 작업(트랜잭션)을 강제로 종료한다.
    • 롤백을 수행해 락을 해제한다.
    • 타임아웃으로 재시도를 유도한다.

    데이터베이스는 대표적으로 교착 상태를 탐지해 한 트랜잭션을 희생시키는 정책을 갖는다. 이는 “한 명을 잠시 멈추게 해서 전체가 다시 움직이게” 만드는 전략이다. 전산학에서는 이를 합리적인 선택으로 본다.

    5) 전산학 관점에서의 실전 체크리스트: 코드와 운영에서 함께 막는다

    전산학 교착 상태를 줄이려면 개발과 운영이 함께 움직여야 한다.

    • 락 획득 순서를 문서화하고 코드 리뷰에서 강제한다.
    • 락 범위를 최소화한다(락을 잡은 채로 네트워크 호출 같은 긴 작업을 하지 않는다).
    • 타임아웃과 재시도 정책을 명확히 둔다.
    • 로그와 모니터링에서 “락 대기 시간”을 지표로 관리한다.
    • 재현 가능한 테스트(동시성 테스트)를 통해 미리 발견한다.

    전산학에서는 동시성 문제는 “언젠가 터진다”에 가깝다. 따라서 발견 후 수정이 아니라, 설계 단계에서 줄이는 것이 비용이 적다.

     

    전산학 교착 상태는 규칙 없는 동시성에서 발생하며, 락 순서와 타임아웃이 현실적 해법이다

    전산학에서 교착 상태(데드락)는 여러 실행 단위가 서로의 자원을 기다리며 무한 대기에 빠지는 상태다. 전산학 교착 상태는 상호 배제, 점유와 대기, 비선점, 환형 대기라는 조건이 동시에 성립할 때 발생하며, 전산학적 해결은 이 조건 중 하나를 의도적으로 깨는 전략으로 정리된다. 실무에서 가장 효과적인 전산학 접근은 락 획득 순서를 통일해 환형 대기를 없애고, 타임아웃과 재시도 정책으로 무한 대기를 방지하는 것이다.
    교착 상태는 “운이 나빠서 생기는 오류”가 아니라 “규칙이 없으면 자연스럽게 생기는 현상”에 가깝다. 전산학을 이해하면 이 문제를 감으로 대응하지 않고 구조로 다룰 수 있다.