복구 방식 - 자원 선점 (Resource Preemption)

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

  1. 본질: 교착 상태 복구를 위해 누군가를 생명과 함께 날려버리는(Process Termination) 대신, 그 녀석의 목숨(스레드 프로세스 자체)은 살려둔 채로 그가 손에 쥐고 있던 자원(프린터, 락, 디스크 등)만 '폭력적으로 빼앗아(Preempt)' 다른 대기자에게 넘겨주어 사이클(Cycle)을 강제 해소하는 우회 복구 수단이다.
  2. 가치: 앱 자체를 팅기게(강제 종료) 해버려서 사용자에게 빡침(Crash)을 안기는 대신, "앗, 자원을 잠깐 뺏겼네? 뒤로 롤백했다가 이따 다시 받아야지" 라며 데이지 체인을 살려둘 수 있어 가용성 극상향을 달성하는 현대 RDBMS 동시성 해결의 절대 표준이다.
  3. 융합: 하지만 뺏을 대상(Victim)을 골라 무사히 빼앗기 위해서는 "뺏은 데이터를 과거 멀쩡했던 상태로 복원"하는 엄청난 후퇴(Rollback/Undo) 메커니즘과 동기화되어 있어야만 쓸 수 있는, 구현 난이도가 가장 극악인 백엔드 철학이다.

Ⅰ. 개요 및 필요성

교착에 빠진 P1, P2가 있다. Termination(강제 종료)는 그냥 경찰(OS)이 와서 P1을 권총으로 쏴 죽여버리고(앱 팅김 에러) P2를 보내는 무식한 진압이다. 유저 입장에선 10시간짜리 영화 인코딩 앱이 바탕화면으로 튕기는(Crash) 참극을 겪는다.

반면 **자원 선점 (Resource Preemption)**은 영리하다. 경찰(OS)은 P1을 죽이지 않는다. 단지 P1이 손에 꽉 쥐고 있던 '비디오 카드의 락(Lock)'을 강제로 비틀어 열어 압수(Preempt)한 뒤 P2에게 던져준다. P1은 비록 놀라서 자빠지지만(에러 코드 반환), 죽진 않고 구석에 쪼그려 앉아있다가(대기), P2가 지나가고 나면 아까 뺏긴 락을 다시 주워들고 작업을 이어나간다(Rollback & Retry).

💡 비유: 길거리 4명 멱살잡이(데드락). 한 명을 총살(Termination)하는 게 아니라, 경찰이 한 명의 팔을 비틀어 등에 업고 있던 가방(자원)만 쑥 빼서(선점) 다른 놈에게 던져준다. 가방 뺏겨 울던 놈은 뒤로 자빠져(롤백) 대기했다가 저놈 지나가면 다시 자기 가방 달라고 줄(대기) 서서 무사히 집으로 걸어간다(생존).

┌─────────────────────────────────────────────────────────────────┐
│         종료(Termination) vs 선점(Preemption)의 복구 차이       │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  [교착 확진: P1과 P2가 서로의 DB Row 락을 잡고 대결 중]         │
│                                                                 │
│  [복구 루트 A: 강제 종료]                                       │
│  OS: "야 빡치네 P1 죽여!" ▶ P1 `Fatal Error` (프로세스 즉사)    │
│  결과: P1의 10시간 연산 스레기 지그시 날아감.                   │
│                                                                 │
│  [복구 루트 B: 자원 선점 (Preemption)]                          │
│  OS: "P1아, 네가 잡고 있는 Row 락 10번만 당장 내놔(선점)!"      │
│  P1: "앗 락을 뺏겼네? 에러코드 1211 (Deadlock Found).           │
│       나 안 죽었으니 트랜잭션 코드 지우고 위로 올라가야지(롤백)"│
│  → P1은 조용히 시작점으로 돌아가(Retry) P2 지나갈 때까지 Wait.  │
│  결과: 앱은 안 죽고(무한 재시도) 무사히 스레드 2개 다 완료!     │
└─────────────────────────────────────────────────────────────────┘

📢 섹션 요약 비유: 선점(Preemption) 방식은 목숨(생명줄)은 보장해 줄 테니 손에 쥔 딱지만 내놓고 저 뒤에 가서 새로 다시 줄 서라고 밀쳐내는 매우 인도적인(?) 회생 시스템입니다.


Ⅱ. 아키텍처 및 핵심 원리

뺏어오기의 3단계 필수 콤포넌트

자원을 강제로 뺐고 돌리는 아름다운 그림을 구현하려면 OS(또는 DBMS)는 미친 듯이 복잡한 3가지 내부 서브 시스템 체인을 가동해야 한다.

  1. 희생자 선택 (Victim Selection): "누구에게서 자원을 빼앗아야 가장 타격(비용)이 적고 가장 짭짤한 이득(사이클 파괴)이 나올까?"를 수치 공식으로 채점한다.
  2. 롤백 (Rollback): 자원을 뺏긴 놈이 억울하게 죽지 않으려면, 자원을 뺏긴 순간 그동안 했던 작업을 **안전한 과거 지점(Safe State / Checkpoint)**으로 무효화시켜 주는 타임머신 복원 모듈이 100% 필수불가결하다. (가장 어려운 기술).
  3. 기아 방지 (Starvation Check): 만만하다고 항상 '그놈' 자원만 뺏어대면 걔는 백 년 동안 롤백만 하다 죽는다. (횟수 제한 리미터를 설계해야 함).

📢 섹션 요약 비유: 이 메커니즘은 단순히 뺏는 게 끝이 아닙니다. 뺏은 애를 과거로 살려놓을 '타임머신(롤백)'을 반드시 탑재해야 하기 때문에, 타임머신 기능이 없는 일반 시골 컴퓨터(OS 단순 파일 I/O)는 이 방식을 못 쓰고 몽둥이(종료)만 씁니다.


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

판단 요소프로세스 강제 종료 (Termination)자원 선점 후 롤백 (Preemption)
구현 난이도1줄짜리 킬(Kill) (하급)타임머신(Undo/Redo Log) 구현 (최상급 고난도)
사용자 체감갑옷처럼 터져서 쌍욕 폭발속으로 롤백/재시도 돌아가 유저 모르게 넘어감
자원 뺏기 저항CPU, Memory 등 뺏어도 복원 쉬운 거디스크 덮어쓰기 등 파일 I/O는 선점 사실상 불가

📢 섹션 요약 비유: 뺏기(선점)가 유일하게 불가능한 건 "이미 프린터로 절반 출력된 종이"입니다. 잉크를 어떻게 과거로 롤백하나요? 그래서 선점 복구는 트랜잭션(가상 숫자) 데이터의 세계를 다루는 RDBMS에서만 황제처럼 쓸 수 있습니다.


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

실무 시나리오:

  1. DB의 데드락 트랜잭션 살려내기 (Deadlock Found, Try restarting transaction): 선점 복구의 최고 권위자는 데이터베이스(MySQL InnoDB)다. 트랜잭션 T1, T2가 꼬였을 때, 갓 MySQL은 T1을 아예 터트려 데이터베이스 서버를 디스커넥트(Termination)시키는 짓을 절대로 하지 않는다! 그저 T1이 물고 있는 락 하나를 '강제 해제(선점)'하고, T1에게 롤백 에러(ER_LOCK_DEADLOCK)를 던져 백그라운드에서 Undo Log를 써서 T1을 시작 전으로 조용히 물린 뒤, 앱 레벨 개발자가 retryTemplate 등으로 다시 타게끔 설계된 고결한 회생 인프라다.

안티패턴:

  • 외부 I/O에 자원 선점 시도하기: 위에서 말한 치명적 무능의 사례다. P1이 Network Socket으로 외부에 결제 API 쏘고 있는데(네트워크 자원 점유) P2와 데드락 났다. 탐지 데몬이 똑똑한 척 "자원 선점(Preemption)하자!"고 소켓 락을 뺏어 P2에게 줬다. 결제 API 서버 입장에선 통신 패킷이 반쯤 들어오다 잘렸고 롤백도 안 된다. 결국 돈은 결제되고 물건은 안 나가는 거대한 쇼핑몰 비즈니스 폭동의 장애(Data Corruption)가 터진다. => "되돌릴 수 없는 것에 선점을 명하지 마라."

📢 섹션 요약 비유: 자원 선점(롤백 부스트)은 물감통(데이터 메모리)을 뺏어 지우개로 지우는 건 완벽하지만, 이미 도화지(디스크/네트워크)에 물감을 흩뿌려버린 뒤에는 과거로 돌릴 수 없어 도화지를 찢어버려야만 하는 치명적 무능(안티패턴)을 지닙니다.


Ⅴ. 기대효과 및 결론

기준타조 알고리즘이나 강제 종료의 잔혹함자원 선점 (Preemption)의 우아함
자원(앱)의 생존무작위로 바탕화면 앱이 꺼짐 (크래시 덤프)묵묵히 버퍼링(지연) 후 유저가 원하던 작업을 끝냄
매몰 비용 증발최악 (1시간 작업 팅김)지점을 잡아서(체크포인트) 최소 지연만 발생!

자원 선점 (Resource Preemption) 모델은, 데드락이 낳은 "누구 한 명은 무조건 죽여야 한다"는 사형의 전제 조건을 **"죽이지 말고 잠시 뺏었다가 과거로 비틀어 무마시키자"**는 유연한 롤백 지향 탄성(Elasticity)으로 우회 돌파해 낸 소프트웨어 엔지니어링의 최고 예술품이다. 오늘날 "앱이 멈추지 않고 버벅거리다 끝끝내 돌아가는 기적"의 90%는 이 보이지 않는 OS의 자원 박탈과 재시도(Rollback) 튜닝 덕분에 유지되고 있다.


📌 관련 개념 맵

개념관계
롤백 (Rollback / Undo)선점당한 프로세스가 억울하게 죽지 않고 과거 1분 전 상태로 비틀어 몸을 숨기게 해 주는 핵심 타임머신 파트너
프로세스 강제 종료 (Termination)자원을 뺏자니 롤백 기능이 없어서 "에라 모르겠다" 하고 죽여버리자며 선점 체제를 깔보는 잔혹 쌍둥이 대안
희생자 선택 (Victim Selection)기왕 누구 자원을 뺏을 거면, 롤백 비용이 가장 작아서 과거로 되돌리기 쉬운 놈을 잡게 해주는 수학 타게팅 등대

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

  1. 두 친구가 닌텐도 스위치 1대를 잡고 서로 자기가 하겠다고 양보 없이 버티는 '데드락' 상황이에요.
  2. "강제 종료(Termination)"는 선생님이 와서 두 친구 모두 엉덩이를 걷어차서 거실 밖으로 내쫓아 게임판을 엎어버리는 거고요!
  3. "자원 선점(Preemption)"은 살살 달래서 한 친구 귀걸이(자원 스위치)만 뺏은 뒤, "넌 세이브포인트(과거 롤백)로 돌아가서 5분만 대기해!" 라며 평화롭게 한 명만 양보시키고 둘 다 팅기지 않게 살려내는 멋진 작전이죠!