비선점 부정 (Deny No-Preemption)

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

  1. 본질: 교착 상태 예방 관점에서의 비선점 부정 (Deny No-Preemption) 기법은 프로세스가 특정 자원 부족으로 할당을 요청하며 대기(Block) 상태로 들어가려 할 때, 현재 자신이 쥐고 있던 기존 자원들을 "운영체제가 강제로 박탈(Preempt)"해버리는(혹은 반환하도록 강제하는) 극약 처방이다.
  2. 가치: 쥐고 있으면서 잠드는(점유 대기) 상황이 오면 그냥 쥐고 있던 걸 죄다 토해내게 만들므로, 다른 스레드가 내 자원을 이용해 고착 고리를 풀 수 있어 데드락이 100% 분해된다.
  3. 융합: 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이 다시 깨어날 때, 절반 인쇄된 문서는 어떻게         │
│  롤백하고 다시 복원할 것인가? (엄청난 복구 오버헤드 장벽)     │
└───────────────────────────────────────────────────────────────┘

📢 섹션 요약 비유: 비선점 부정은 수채화 그리다 물감이 모자라 기다리니, 미술 선생님이 "기다리는 동안 도화지도 딴 친구 줘!" 하고 뺏어버리는 겁니다. 교실 안 그림 그리는 사람은 계속 돌아가지만(데드락 없음) 뺏긴 내 도화지는 다시 처음부터 스케치해야 합니다(롤백의 피로도).


Ⅱ. 아키텍처 및 핵심 원리

상태 저장이 불가한 물리적 비선점 한계

이론적으론 아주 간단히 "뺏어!" 하면 될 것 같지만 현대 컴퓨터 아키텍처는 이를 완강히 거부한다.

  1. 상태(Context) 복사 비용의 폭증: CPU는 레지스터 몇 바이트 버리면 그만이다(완벽한 선점 부정). 그러나 프린터나 DVD 버너, 혹은 DB 테이블 업데이트는 중간에 뺏기면 잉크가 번지고 데이터 트랜잭션이 깨진다.
  2. 소프트웨어 롤백 로그 (Undo Log): 만약 굳이 비선점을 파괴하고 뺏어 오려면, DBMS처럼 그동안 해온 모든 작업을 추적하는 UNDO 로그를 촘촘히 짜서 "뺏김과 동시에 예전 상태로 무결점 타임머신 복원"을 수행해야 하는데 엄청난 연산 부하가 터진다.

📢 섹션 요약 비유: 강제 선점이 CPU에선 쉽지만, 하드디스크 쓰기 에선 불가능한 건 블럭 쌓기(CPU-쉽게 멈추고 기록)와 찰흙 빚기(디스크-중간에 남이 만지면 아예 망함)의 차이입니다. 찰흙은 절대 뺏으면 안 되는 비선점 룰의 성역입니다.


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

예방 파괴의 표적자원 환원 가능성도입 현실성 (데어/소프트웨어)
상호 배제 타파Read-Only 등 특수만 가능프린터/DB엔 절대 도입 불가 (데이터 붕괴)
비선점(No-Preempt) 타파CPU/메모리는 아주 잘 환원됨DBMS의 롤백/락-타임아웃으로 이빨 빠진 형태로 응용
순환 대기 타파락 순서화(Lock Hierachy)가장 현실성 100%의 엔지니어링 패러다임

📢 섹션 요약 비유: 결국 4가지 데드락 조건 중 시스템이 뺏을 수 있는 건(비선점 부정) CPU(머리)나 메모리(책상) 정도일 뿐, 이미 잉크가 묻은 프린터(손발)를 강제로 꺾어버릴 수는 없어 반쪽짜리 대책입니다.


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

실무 시나리오:

  1. CPU 스케줄러 (타이머 인터럽트 기반): 데드락 관점이 아니라 코어 병발성을 위해 타임 슬라이스(10ms)가 지나거나 더 높은 우선순위 태스크가 오면 즉시 레지스터 Context를 PCB에 우겨넣고 강제 탈취(응용형 비선점 부정)한다. 이 덕분에 코어 위에서는 교착 상태라는 단어가 성립하지 않는다.
  2. 트랜잭션 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줄 비유 설명

  1. 내가 물감(자원)을 쥐고 도화지(자원)를 달라고 기다리는데, 도화지가 안 나온다고 미술 선생님이 나에게서 강제로 물감을 확! 뺏어버리는 규칙(비선점 파괴).
  2. 데드락(얼음 땡)은 당장 풀리고 다른 친구가 뺏긴 내 물감을 쓰겠지만, 뺏긴 내 그림은 완전히 망쳐지고 눈물이 나겠죠? (복구 불가능 에러)
  3. 그래서 이런 강력한 뺏기 룰은 찢어져서 버려져도 바로 다시 그릴 수 있는 칠판(CPU) 같은 곳에서만 쓸 수 있고, 찰흙(데이터)에는 절대 쓸 수 없는 위험한 룰이랍니다!