교착 상태 복구 (Recovery from Deadlock)

핵심 인사이트 (3줄 요약)

  1. 본질: 교착 상태 복구 (Recovery from Deadlock)는 탐지 알고리즘(Detection)이 발견해 낸 막혀버린 원형 도로(사이클)를 해소하기 위해, OS가 얽혀있는 프로세스의 목을 베거나 쥐고 있는 자원을 강제로 압수하여 피를 흘리고 사이클 고리를 파괴하는 최후의 숙청(사후 조치) 과정이다.
  2. 가치: 아무리 대단한 탐지(Detection)로 사이클을 감지해 냈어도 결국 스스로 풀려나는 법은 없기에, "반드시 누군가를 죽이고 남의 자원을 뺏어 원형 대기(Circular Wait)를 끊어준다"는 복구 메커니즘이 한 몸으로 결합되어야만 비로소 '탐지-복구'라는 온전한 자율주행 회복 탄력성(Resilience)이 완성된다.
  3. 융합: 복구 작업은 피를 흘리는 방식에 따라 (1) 프로세스 자체를 폭파(Process Termination)하는 방식과 (2) 프로세스는 살려두고 보유 자원만 강제로 탈취선점(Resource Preemption)하는 두 가지 큰 줄기로 나뉘며, DBMS 트랜잭션 롤백 아키텍처에서 이 사상이 결합해 동시성 장애 해소의 바이블로 자리잡았다.

Ⅰ. 개요 및 필요성

교착 상태에 빠진 스레드들은 서로 양보라는 걸 모른다. 누가 멱살을 잡고 풀어주기 전까지 무한대기(Infinity Block) 상태로 화석이 되어 영겁의 시간을 보낸다.

탐지 드론(OS Detection Daemon)이 "저기 4명이 서로 멱살 잡고 원(Cycle)을 그리고 있네!!"라고 경보를 울렸다면, "교착 상태 복구(Recovery)" 특수부대가 투입된다. 이들의 유일한 목표는 단 하나다. "무조건 원(사이클)에 끊어진 구멍을 낸다." 어떻게? 누군가 한 명을 강제로 쏴서 죽이거나(Kill), 그 한 명이 쥐고 있던 칼(자원)을 억지로 뺏어 남에게 던져줌으로써(Preemption)!

💡 비유: 교차로 4대 알박기 꼬리물기 사고(데드락). 탐지(경찰)가 떴다. 4대 다 비킬 생각을 안 하니, 견인차(복구 모듈)가 출동해서 차 1대를 통째로 들어서 폐차장으로 던져버리거나(Kill), 차에서 운전자를 대포로 쏴 쫓아내고 차를 뒤로 쑥 빼버린다(Preempt). 그 빈 공간 1개가 생기는 순간 나머지 3대는 신나서 시동을 걸고 지나갈 수 있다. 무사히 돌아가는 시스템을 위해 한 놈을 바치는 제물(Victim) 의식.

┌────────────────────────────────────────────────────────────────┐
│         교착 상태 복구(Recovery)의 2대 처단 강령               │
├────────────────────────────────────────────────────────────────┤
│                                                                │
│  탐지 결과 보고 접수: "P1→P2→P3→P1 데드락 확진!"               │
│                                                                │
│  [루트 1 (Process Termination): 사람을 청부 살해!]             │
│  ① 전체 사살 (Abort All): "P1, P2, P3 셋 다 죽여(Kill)!"       │
│     ▶ 1방에 해결! (하지만 여태껏 쓴 자원과 노력 몽땅 증발)     │
│  ② 순차 사살 (Abort One-by-One): "일단 만만한 P1만 짤라!"      │
│     ▶ 1놈 자르고, 다시 스캔 돌려서 데드락 풀렸는지 확인.       │
│     ▶ 풀렸으면 P2, P3은 구출! 안 풀렸으면 P2도 짤라!           │
│                                                                │
│  [루트 2 (Resource Preemption): 소매치기 강탈!]                │
│  ① 희생자 선정 (Victim): "비용이 제일 싼 P2를 털자"            │
│  ② 롤백 (Rollback): "P2야 네가 쥔 자원 A 당장 토해내렴."       │
│  ③ 기아(Starvation) 방지: "야 P2 너무 여러 번 털리는데?"       │
└────────────────────────────────────────────────────────────────┘

📢 섹션 요약 비유: 탐지가 암을 발견(진단서 발급)한 거라면, 복구는 직접 메스를 들고 암 덩어리의 피가 통하는 혈관(사이클 간선) 중 가장 만만한 하나를 쓱! 하고 잘라버리는 무자비한 집도의(Surgeon)입니다.


Ⅱ. 아키텍처 및 핵심 원리

"누구를 죽일 것인가? (Victim Selection)"

복구 과정에서 가장 뼈아픈 수식은 '죽일 놈 고르기(Victim Selection)'다. 왜냐하면 죽여서 롤백하는 데 들어가는 컴퓨터의 비용(Overhead)이 다 다르기 때문이다.

  1. 처리 완료도 (Progress): 여태 1시간 동안 계산해 놓은 P1을 죽일래? 방금 켜진 P2를 죽일래? (당연히 P2 척살).
  2. 보유 자원의 가치 (Resource Amount): P1은 자원 100개를 움켜쥐고 있다. 얘를 죽이면 자원 100개가 공중에 흩날려 거대한 대박(여유)이 터지므로, P3, P4 등 수십 명을 구하려는 복구 알고리즘의 최우선 희생양으로 점 찍힌다.
  3. 사용자의 속성 (User Level): 운영체제 루트(ROOT)가 돌리는 백그라운드 P1을 죽일래? 동네 유저가 심심해서 킨 배경화면 위젯 P2를 죽일래? (우선순위를 따져 무참히 P2가 희생당함).

📢 섹션 요약 비유: 4명이 얽혔을 때 경찰(복구 로직)은 무작정 총을 쏘는 게 아니라 수첩을 꺼냅니다. "가장 가난한 놈, 가장 일 안 한 놈, 빽 없는 놈(최소 비용)"을 재빠르게 계산해 한 놈만 골라내서 핀셋으로 죽여버리는 잔혹성을 띱니다.


Ⅲ. 융합 비교 및 다각도 분석

4대 교착 대처 철학적용 타이밍주된 활약상희생 발생 여부
교착 방임 (Ostrich)무시 (어차피 잘 안 터짐)블루스크린, 유저의 빡종 재부팅 유발시스템 전체 사망 (치명적)
예방 (Prevention)얽히기 전 룰 제약자원 활용성 바닥 (효율성 박살)피 안 흘림 (아예 싸울 일을 차단)
회피 (Avoidance)행렬로 예측 후 거절CPU가 연산하다 뻗음피 안 흘림 (위험할 거 같으면 안 줌)
탐지 & 복구 (Recovery)터졌을 때 (사후 대응)DB 롤백 코어나 트러블슈팅의 핵심명백한 희생자 1인(Victim Abort/Rollback) 발생

📢 섹션 요약 비유: 회피가 쫄보 엄마(안 줄래 모드), 타조가 방임 부모(안 볼래 모드)라면, 복구는 형제끼리 치고박고 싸우다 한계점(사이클)을 넘어섰을 때 몽둥이 들고 나타나 장난감을 뺏어 부숴버리는 호랑이 아빠입니다 (피를 보는 대신 바로 상황 종료).


Ⅳ. 실무 적용 및 기술사적 판단

실무 시나리오:

  1. RDBMS (Oracle, MySQL) 트랜잭션 Victim 튜닝: 데이터베이스의 꽃! DB는 타조 알고리즘을 쓸 수 없다 (돈 관련 트랜잭션이 영원히 멈추면 대형 금융사고!). 탐지 데몬이 사이클을 잡는 순간, 락 매니저는 'Undo Log량(가장 일 조금 한 놈)'을 체크해 Victim으로 확정 짓고 $ Transaction Rolled back: Deadlock 이란 에러와 함께 그 트랜잭션을 강제 종료(복구조치 루트 1-②)시킨다. 앱 개발자는 이 에러를 캐치해서 while문으로 쿼리를 2~3번 지연 재시도해 살아남게 코딩하는 것이 실무의 정석이다.

안티패턴:

  • 복구 로직에 희생자 보호장치가 없는 생태계 (현대 기아의 원인): 희생자 비용 계산 수식을 짰더니, 하필 A 프로그램이 계속 0.1초짜리 가벼운 틱(Tick) 프로그램이라 매번 "죽이는데 가장 싼 놈"으로 낙인찍힌다. 데드락 터질 때마다 경찰이 A만 잡아 패니까 A는 영원히 시스템에서 일을 완료하지 못하고 기아(Starvation) 상태라는 최악의 버그 지옥에 처박힌다.

📢 섹션 요약 비유: 이 동네 교착 해결 방식은 삥 뜯긴 불쌍한 애(비용 적은 놈)를 만만하다는 이유로 한 대 더 치는 거라, 걔가 굶어 죽는 사이드 이펙트(기아 상태)가 생깁니다. 그래서 "이번엔 봐준다(희생 횟수 체크)"는 카운터 룰을 달아 실무에 융합합니다.


Ⅴ. 기대효과 및 결론

기준복구의 결단 (단칼)지속 대기 방치 (무수습)
자원 순환율희생자 1명의 몫이 폭죽처럼 터져 모두 윤택해짐교차로 영구 마비. 사용률 0% 수렴
복구 구현 비용Undo(롤백) 로그라는 트랜잭션 롤백 인프라 필수 지참코드 한 줄 안 짬

교착 상태 복구 (Recovery from Deadlock)는, 예방이라는 고귀한 이상향을 깨뜨린 컴퓨터 생태계가 짊어져야만 하는 피할 수 없는 징벌적 비용이다. 시스템 파국의 도미노 사슬(Cycle) 안에서 유혈 사태 없이 탈출하는 법은 없다. 하지만 "적절한 하나를 죽여 전체를 살리는" 최적 Victim 탐색 알고리즘과 Rollback 인프라라는 위대한 진화를 이끌어내며, 오늘날 무한정 멈추지 않는 상용 서비스를 지탱하는 가장 본능적이고 실전적인 방어 기제로 빛을 발하고 있다.


📌 관련 개념 맵

개념관계
교착 상태 탐지 (Detection)복구 특공대를 헬기에서 출동시키는 부저 스위치를 누르는 정찰 선발대 선행 개념
롤백 (Rollback) & 체크포인트아무리 프로세스를 죽이고 뺏어도 "죽기 직전 멀쩡한 상태"로 돌려놓는 위대한 부활의 데이터 스냅샷 시스템
교착 상태 기아 (Starvation)항상 맞는 놈만 맞다 보니 벌어지는 불행의 그림자, 복구 알고리즘이 낳은 돌연변이 버그
프로세스 강제 종료 (Abort) / 자원 선점 (Preempt)복구 사령관이 쓰는 2가지 종류의 칼. 누굴 벨 것인가? (사람 vs 물건)

👶 어린이를 위한 3줄 비유 설명

  1. 친구 4명이서 서로 과자를 꽉 쥐고 안 놔주며 데드락(얼음 땡)에 걸려 아무도 못 먹고 화만 내고 있어요.
  2. 이때 선생님(OS)이 출동하는 조치가 "복구(Recovery)"예요! 4명 중 가장 목소리 작고 과자 조금 먹은 만만한 한 명(희생자)을 딱 골라서 벌을 세우죠.
  3. 벌 세워진 아이의 손에서 과자가 쏟아지면!(자원 뺏기/강제 종료), 나머지 3명의 악동들은 환호성을 지르며 서로 과자를 나눠 먹고 평화를 찾게 되는(사이클 해소) 슬프고도 효과적인 치우기 전략입니다!