비선점 부정 (Deny No-Preemption)
핵심 인사이트 (3줄 요약)
- 본질: 교착 상태 예방 관점에서의 비선점 부정 (Deny No-Preemption) 기법은 프로세스가 특정 자원 부족으로 할당을 요청하며 대기(Block) 상태로 들어가려 할 때, 현재 자신이 쥐고 있던 기존 자원들을 "운영체제가 강제로 박탈(Preempt)"해버리는(혹은 반환하도록 강제하는) 극약 처방이다.
- 가치: 쥐고 있으면서 잠드는(점유 대기) 상황이 오면 그냥 쥐고 있던 걸 죄다 토해내게 만들므로, 다른 스레드가 내 자원을 이용해 고착 고리를 풀 수 있어 데드락이 100% 분해된다.
- 융합: CPU 타이머나 메모리 페이지처럼 "현재까지의 상태를 쉽게 멈추고 롤백/복원(Context Save/Restore)할 수 있는" 일부 자원에만 제한적으로 접목되며, 프린터나 DB의 핵심 락처럼 작업 도중 뺏기면 아예 데이터가 박살 나는 무결성 필수 자원에는 도입 자체가 물리적으로 불가능하다.
Ⅰ. 개요 및 필요성
데드락의 세 번째 조건인 '비선점(No Preemption)'은 "내가 내 손으로 내려놓기 전엔 아무도 못 뺏어!"라는 철칙이다.
이걸 깨버리는 비선점 부정은 아주 무자비하지만 확실한 해결책이다. "네가 자원 A를 쥐고 B를 달라고 손을 내밀었지? 근데 B가 당장 없어? 그럼 넌 괘씸죄로 당장 네가 쥐고 있던 A마저 강제로 뱉어내고 쫓겨나라!"
💡 비유: 줄을 서서 식판(A)을 받고 반찬(B)을 받으려는데 반찬이 다 떨어져 멈춰 서면, 배식원이 "뒤에 식판 필요한 사람 있으니까, 너 식판 도로 뺏고 반찬 채워질 때까지 아예 식당 밖으로 나가!" 하고 내쫓는 것. 내 뒤통수에 붙어있던 대기열(데드락 후보군)은 해소된다.
┌───────────────────────────────────────────────────────────────┐
│ 비선점(No Preemption) 부정을 통한 교착상태 타파 │
├───────────────────────────────────────────────────────────────┤
│ │
│ [상황] 프로세스 P1이 자원 R1(프린터) 점유 중. │
│ 이제 R2(디스크)를 요청하는데 꽉 쳐서 막힘! │
│ │
│ [비선점 (오리지널 룰)] │
│ P1은 R2가 나올 때까지 R1 안 놓고 그 자리에서 꿀잠. │
│ → 누군가 R1을 원하면 영구 데드락(Deadlock) 발동! │
│ │
│ [비선점 부정 (강제 선점으로 룰 파괴)] │
│ OS: "야 P1, R2 없으니까 눈 감아. 그리고 네가 쥔 R1 내놔!" │
│ P1: 프린트 절반 출력 중인데요? (강제로 뽑히고 상태 소멸) │
│ → 대기 중이던 P2가 R1을 쓰며 스무스하게 진행. │
│ │
│ 문제: P1이 다시 깨어날 때, 절반 인쇄된 문서는 어떻게 │
│ 롤백하고 다시 복원할 것인가? (엄청난 복구 오버헤드 장벽) │
└───────────────────────────────────────────────────────────────┘
📢 섹션 요약 비유: 비선점 부정은 수채화 그리다 물감이 모자라 기다리니, 미술 선생님이 "기다리는 동안 도화지도 딴 친구 줘!" 하고 뺏어버리는 겁니다. 교실 안 그림 그리는 사람은 계속 돌아가지만(데드락 없음) 뺏긴 내 도화지는 다시 처음부터 스케치해야 합니다(롤백의 피로도).
Ⅱ. 아키텍처 및 핵심 원리
상태 저장이 불가한 물리적 비선점 한계
이론적으론 아주 간단히 "뺏어!" 하면 될 것 같지만 현대 컴퓨터 아키텍처는 이를 완강히 거부한다.
- 상태(Context) 복사 비용의 폭증: CPU는 레지스터 몇 바이트 버리면 그만이다(완벽한 선점 부정). 그러나 프린터나 DVD 버너, 혹은 DB 테이블 업데이트는 중간에 뺏기면 잉크가 번지고 데이터 트랜잭션이 깨진다.
- 소프트웨어 롤백 로그 (Undo Log): 만약 굳이 비선점을 파괴하고 뺏어 오려면, DBMS처럼 그동안 해온 모든 작업을 추적하는 UNDO 로그를 촘촘히 짜서 "뺏김과 동시에 예전 상태로 무결점 타임머신 복원"을 수행해야 하는데 엄청난 연산 부하가 터진다.
📢 섹션 요약 비유: 강제 선점이 CPU에선 쉽지만, 하드디스크 쓰기 에선 불가능한 건 블럭 쌓기(CPU-쉽게 멈추고 기록)와 찰흙 빚기(디스크-중간에 남이 만지면 아예 망함)의 차이입니다. 찰흙은 절대 뺏으면 안 되는 비선점 룰의 성역입니다.
Ⅲ. 융합 비교 및 다각도 분석
| 예방 파괴의 표적 | 자원 환원 가능성 | 도입 현실성 (데어/소프트웨어) |
|---|---|---|
| 상호 배제 타파 | Read-Only 등 특수만 가능 | 프린터/DB엔 절대 도입 불가 (데이터 붕괴) |
| 비선점(No-Preempt) 타파 | CPU/메모리는 아주 잘 환원됨 | DBMS의 롤백/락-타임아웃으로 이빨 빠진 형태로 응용 |
| 순환 대기 타파 | 락 순서화(Lock Hierachy) | 가장 현실성 100%의 엔지니어링 패러다임 |
📢 섹션 요약 비유: 결국 4가지 데드락 조건 중 시스템이 뺏을 수 있는 건(비선점 부정) CPU(머리)나 메모리(책상) 정도일 뿐, 이미 잉크가 묻은 프린터(손발)를 강제로 꺾어버릴 수는 없어 반쪽짜리 대책입니다.
Ⅳ. 실무 적용 및 기술사적 판단
실무 시나리오:
- CPU 스케줄러 (타이머 인터럽트 기반): 데드락 관점이 아니라 코어 병발성을 위해 타임 슬라이스(10ms)가 지나거나 더 높은 우선순위 태스크가 오면 즉시 레지스터 Context를 PCB에 우겨넣고 강제 탈취(응용형 비선점 부정)한다. 이 덕분에 코어 위에서는 교착 상태라는 단어가 성립하지 않는다.
- 트랜잭션 Victim Rollback (RDBMS): 락이 꼬였을 때 오라클/MySQL은 Victim을 골라 Undo Segment를 이용해 데이터를 옛날로 되돌리고 락을 다 강제로 풀어버린다. "너 하던 업데이트 다 취소하고 자원 뱉아!" 이는 비선점 부정을 고도화된 SW 로직(롤백)으로 가장 극적으로 융합시킨 실무 최고의 사례다.
안티패턴:
- 외부 I/O 장치를 Lock 안에서 점유 대기: 외부 소켓 API나 파일 I/O는 본질적으로 '비선점' 자원이다. 이걸 쥔 채 스레드 수십 개가 데드락에 빠지면, 어플리케이션 개발자는 롤백 메커니즘을 짠 적이 없으므로 영원히 서버가 마비되는 참사를 유발한다. "절대 비선점/블로킹 I/O를 Critical Section 안에 두지 마라."
📢 섹션 요약 비유: DBMS가 데드락 꼬였을 때 한 명을 강제로 롤백(비선점 파괴) 시킬 수 있는 건, 뒤로 감기(Undo) 기능의 타임머신을 구현하느라 피땀을 쏟았기 때문입니다. 타임머신이 없는 평범한 프로그램에서 강제로 뺏으면 시스템이 다 부서집니다.
Ⅴ. 기대효과 및 결론
| 기준 | 자발적 해제(비선점 존중) | 강제 탈취(비선점 부정) OS 구축 |
|---|---|---|
| 시스템 무결성 수호 | 보장됨 (조용히 기다리기만 하므로) | 심장 뜯어냄 (복구 로직 없으면 블루스크린) |
| 데드락 교착 확률 | 무방비 시 발생 빈도 높음 | 원천 파괴 (하지만 파편 잔재인 기아 유발) |
| 도입 한계점 | 락 오더링/타임아웃 같은 꼼수 요 | CPU 이외 주변 디바이스에는 도입 단념 |
비선점(No Preemption)을 부정하는 방식은 기계적, 물리적 한계 앞에서 무릎을 꿇었다. 데드락을 예방하려 모터를 고장 낼 순 없는 노릇이었기 때문이다. 다만 이 아이디어는 트랜잭션이라는 거대한 SW 생태계를 만나 Undo/Redo 롤백 기법(사후 복구)으로 승화되어, 데이터베이스의 막강한 동시성 제어 백신으로 환생한 위대한 영감을 제공했다.
📌 관련 개념 맵
| 개념 | 관계 |
|---|---|
| 문맥 교환 (Context Switching) | CPU 자원 위에서 완벽한 '비선점 부정'을 구현해 내는 OS 핵심 뼈대 |
| 타임아웃 백오프 (Timeout Backoff) | 강제 탈취(OS)가 아니라 사용자(APP)가 자발적으로 자리를 비켜주며 비선점을 회피하는 자구책 |
| 트랜잭션 롤백 (Rollback) | 억지로 남의 것을 빼앗기 위해 과거로 데이터를 되돌려 무결성을 기워내는 피눈물나는 대가 연산 |
| 기아 상태 (Starvation) | 내 자원을 자꾸 억지로 뺏기는 불운한 스레드가 끝끝내 밥상에 앉지 못하고 굶어 죽는 사이드 버그 |
👶 어린이를 위한 3줄 비유 설명
- 내가 물감(자원)을 쥐고 도화지(자원)를 달라고 기다리는데, 도화지가 안 나온다고 미술 선생님이 나에게서 강제로 물감을 확! 뺏어버리는 규칙(비선점 파괴).
- 데드락(얼음 땡)은 당장 풀리고 다른 친구가 뺏긴 내 물감을 쓰겠지만, 뺏긴 내 그림은 완전히 망쳐지고 눈물이 나겠죠? (복구 불가능 에러)
- 그래서 이런 강력한 뺏기 룰은 찢어져서 버려져도 바로 다시 그릴 수 있는 칠판(CPU) 같은 곳에서만 쓸 수 있고, 찰흙(데이터)에는 절대 쓸 수 없는 위험한 룰이랍니다!