복구 방식 - 자원 선점 (Resource Preemption)
핵심 인사이트 (3줄 요약)
- 본질: 교착 상태 복구를 위해 누군가를 생명과 함께 날려버리는(Process Termination) 대신, 그 녀석의 목숨(스레드 프로세스 자체)은 살려둔 채로 그가 손에 쥐고 있던 자원(프린터, 락, 디스크 등)만 '폭력적으로 빼앗아(Preempt)' 다른 대기자에게 넘겨주어 사이클(Cycle)을 강제 해소하는 우회 복구 수단이다.
- 가치: 앱 자체를 팅기게(강제 종료) 해버려서 사용자에게 빡침(Crash)을 안기는 대신, "앗, 자원을 잠깐 뺏겼네? 뒤로 롤백했다가 이따 다시 받아야지" 라며 데이지 체인을 살려둘 수 있어 가용성 극상향을 달성하는 현대 RDBMS 동시성 해결의 절대 표준이다.
- 융합: 하지만 뺏을 대상(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가지 내부 서브 시스템 체인을 가동해야 한다.
- 희생자 선택 (Victim Selection): "누구에게서 자원을 빼앗아야 가장 타격(비용)이 적고 가장 짭짤한 이득(사이클 파괴)이 나올까?"를 수치 공식으로 채점한다.
- 롤백 (Rollback): 자원을 뺏긴 놈이 억울하게 죽지 않으려면, 자원을 뺏긴 순간 그동안 했던 작업을 **안전한 과거 지점(Safe State / Checkpoint)**으로 무효화시켜 주는 타임머신 복원 모듈이 100% 필수불가결하다. (가장 어려운 기술).
- 기아 방지 (Starvation Check): 만만하다고 항상 '그놈' 자원만 뺏어대면 걔는 백 년 동안 롤백만 하다 죽는다. (횟수 제한 리미터를 설계해야 함).
📢 섹션 요약 비유: 이 메커니즘은 단순히 뺏는 게 끝이 아닙니다. 뺏은 애를 과거로 살려놓을 '타임머신(롤백)'을 반드시 탑재해야 하기 때문에, 타임머신 기능이 없는 일반 시골 컴퓨터(OS 단순 파일 I/O)는 이 방식을 못 쓰고 몽둥이(종료)만 씁니다.
Ⅲ. 융합 비교 및 다각도 분석
| 판단 요소 | 프로세스 강제 종료 (Termination) | 자원 선점 후 롤백 (Preemption) |
|---|---|---|
| 구현 난이도 | 1줄짜리 킬(Kill) (하급) | 타임머신(Undo/Redo Log) 구현 (최상급 고난도) |
| 사용자 체감 | 갑옷처럼 터져서 쌍욕 폭발 | 속으로 롤백/재시도 돌아가 유저 모르게 넘어감 |
| 자원 뺏기 저항 | CPU, Memory 등 뺏어도 복원 쉬운 거 | 디스크 덮어쓰기 등 파일 I/O는 선점 사실상 불가 |
📢 섹션 요약 비유: 뺏기(선점)가 유일하게 불가능한 건 "이미 프린터로 절반 출력된 종이"입니다. 잉크를 어떻게 과거로 롤백하나요? 그래서 선점 복구는 트랜잭션(가상 숫자) 데이터의 세계를 다루는 RDBMS에서만 황제처럼 쓸 수 있습니다.
Ⅳ. 실무 적용 및 기술사적 판단
실무 시나리오:
- 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대를 잡고 서로 자기가 하겠다고 양보 없이 버티는 '데드락' 상황이에요.
- "강제 종료(Termination)"는 선생님이 와서 두 친구 모두 엉덩이를 걷어차서 거실 밖으로 내쫓아 게임판을 엎어버리는 거고요!
- "자원 선점(Preemption)"은 살살 달래서 한 친구 귀걸이(자원 스위치)만 뺏은 뒤, "넌 세이브포인트(과거 롤백)로 돌아가서 5분만 대기해!" 라며 평화롭게 한 명만 양보시키고 둘 다 팅기지 않게 살려내는 멋진 작전이죠!