운영체제 따라잡기

데드락 기초

meellon 2026. 6. 26. 05:00

학습 목표

데드락(deadlock) 이 무엇인지, 왜 영원히 풀리지 않는 상태인지 설명할 수 있다.

데드락 필요조건 4가지를 나열하고 각각의 의미를 설명할 수 있다.

자원 할당 그래프(RAG) 에서 사이클이 데드락과 어떤 관계인지 설명할 수 있다.

락 순서를 통일하지 않아 생기는 전형적 2-process 데드락을 그릴 수 있다.

문제 상황

  • 마이크로서비스 A→B, B→A 동기 HTTP 호출 후 둘 다 타임아웃 없이 대기
  • 스레드 1: lock(A); lock(B); / 스레드 2: lock(B); lock(A); — 재현율 낮은 hang
  • DB 트랜잭션이 락 대기로 쌓이고 애플리케이션 전체가 멈춘 것처럼 보인다
  • kill -9로만 풀리는 프로세스 — OS가 자동으로 고르지 않는다

동기화 도구를 쓰면 배제는 되지만, 잘못 쓰면 교착에 빠진다.

1. 데드락이란

둘 이상의 프로세스·스레드가 서로가 가진 자원을 기다리며 무한 대기하는 상태.

  • CPU가 아무에게도 할당되지 않거나, 일부만 돌아가는 부분 교착도 있다
  • OS는 탐지·복구를 할 수도 있고, 예방·회피로 안 들어가게 할 수도 있다

2. 필요조건 4가지 (Coffman)

네 가지가 동시에 성립해야 데드락이 가능하다. 하나라도 깨면 예방·회피 여지가 생긴다.

조건 의미 깨는 아이디어
상호 배제 자원을 한 번에 하나만 사용 공유 가능 자원만 쓰기(항상 가능하진 않음)
점유와 대기 일부 자원을 쥔 채 다른 자원 대기 한꺼번에 요청(all-or-nothing)
비선점 자원을 강제로 빼앗을 수 없음 선점 가능 자원(주로 CPU·메모리 일부)
순환 대기 P0→P1→…→P0 형태의 대기 고리 락 순서 전역 정렬
  • 실무에서 가장 자주 쓰는 해법: 순환 대기 제거 — 모든 락을 정해진 순서로만 획득

3. 자원 할당 그래프 (RAG)

요소 표기
프로세스
자원 타입 사각형 (인스턴스 점으로)
할당 자원 → 프로세스 화살표
요청 프로세스 → 자원 점선

그래프 데드락
사이클 없음 데드락 없음
사이클 있음, 자원당 인스턴스 1개 데드락
사이클 있음, 인스턴스 여러 개 데드락 가능 (추가 분석 필요)

4. 고전 예: 두 스레드·두 락

Thread 1:  lock(mutex_A);  lock(mutex_B);
Thread 2:  lock(mutex_B);  lock(mutex_A);

시점 Thread 1 Thread 2
t1 A 획득 B 획득
t2 B 대기 A 대기
결과 순환 대기 — 둘 다 영원히 block  
  • 해결: 항상 A → B 순서로만 lock
  • std::lock(m1, m2) 처럼 동시 획득 API도 순환 대기를 막는 패턴

5. 데드락 vs 기아(starvation)

  데드락 기아
상태 아무도 진행 못 함 일부만 영원히 대기
필요조건 4가지 동시 우선순위·불공정 스케줄링
A↔B 락 낮은 우선순위 프로세스
  • Livelock: 서로 양보하며 진행도 못 하는 바쁜 대기 — 데드락은 아님

6. 정리

  • 데드락 = 상호 배제 + 점유 대기 + 비선점 + 순환 대기
  • RAG 사이클은 직관적 모델, 단일 인스턴스면 사이클 ↔ 데드락
  • 전역 순서가 실무 1순위 예방책
  • 다음: 예방·회피(Banker)·탐지·복구

다음에 다룰 것

  • 데드락 해결
  • 예방, 회피, Banker 알고리즘, 탐지·복구

해당 내용은 Operating System Concepts, 10/E (Avraham Silberschatz, Peter Baer Galvin, Greg Gagne) 의 내용을 기반으로 합니다.

'운영체제 따라잡기' 카테고리의 다른 글

동시성 문제 사례  (0) 2026.06.28
데드락 해결  (0) 2026.06.27
동기화 도구  (0) 2026.06.25
CPU 스케줄링 기초  (0) 2026.06.24
스레드  (0) 2026.06.23