Log in Get started
← 가이드 목록
시작하기

Starvation이란? 특정 Thread나 작업이 계속 실행 기회를 얻지 못하는 현상 쉽게 이해하기

Starvation은 시스템은 계속 동작하지만 특정 Thread·작업만 CPU·Lock·Queue 기회를 계속 못 얻는 기아 상태입니다. Aging·Fair Lock·CAS·Wait-Free·Bulkhead까지 초보 기준으로 정리합니다.

Starvation이란? 특정 Thread나 작업이 계속 실행 기회를 얻지 못하는 현상 쉽게 이해하기

Thread A·B·C가 Lock 하나를 나눠 쓰는데 A와 B만 계속 획득하고 C는 끝없이 기다린다면, 시스템 전체는 멈추지 않았습니다. A·B는 일을 끝냅니다. 하지만 C는 실행 기회를 못 얻습니다. 식당에서 VIP만 계속 먼저 주문받고 일반 손님만 뒤로 밀리는 것과 같습니다. 이것이 Starvation(스타베이션, 기아 상태)입니다. 영어로는 굶주림을 뜻하고, CPU·Lock·Queue 같은 자원을 「공급받지 못하는」 비유입니다. Deadlock은 서로 기다려 모두 멈춤, Starvation은 다른 작업은 진행·특정만 계속 굶음입니다. Livelock은 계속 움직이지만 서로 양보만 해 아무도 완료하지 못하는 상태라, 「다른 작업은 실제로 완료되는」 Starvation과 다릅니다.

Deadlock  → 모두 진행 못 함
Livelock  → 움직이지만 완료 없음
Starvation → 다른 작업은 완료 · 특정만 계속 대기
Deadlock·Livelock·Starvation 비교와 Aging으로 우선순위가 올라가는 흐름
시스템은 도는데 C만 밀리면 Starvation, 오래 기다릴수록 Priority를 올리는 Aging이 대표 완화

Priority · Aging · Fair Lock · Tail Latency

High Priority가 계속 들어오면 Low는 이론상 영원히 기다릴 수 있습니다. Priority Queue도 High만 처리하면 Low가 뒤로 밀립니다. Aging은 대기 시간에 비례해 Priority를 올려 「오래 기다린 작업을 무시하지 않는」 기법입니다. Unfair Lock은 성능상 유리할 수 있지만 A·B만 반복 획득하면 C가 Lock Starvation에 빠질 수 있어 Fair Lock(대기열 순서)과 Throughput·Fairness Trade-off를 봅니다. 초당 10만 건을 처리해도 특정 요청만 30·60·120초라면 그 사용자에게는 실패입니다. 평균만 보면 놓치기 쉽고 p99 Tail Latency·Oldest Task Age·우선순위별 완료 수가 신호입니다.

Waiting Time + Service Time = Total Latency
Starvation ≈ Waiting Time이 비정상적으로 큼

CAS · Lock-Free · Wait-Free · Reader-Writer

ABA 글에서 본 CAS 경쟁에서도 A·B만 성공하고 C만 수만 번 실패하면 Starvation입니다. Lock-Free는 「시스템 전체에서 누군가는 계속 진행」이지 「모든 Thread가 유한 시간 안에 완료」가 아닙니다. Wait-Free는 각 Operation 완료를 보장해 Starvation을 막는 더 강한 Progress Guarantee이고, Obstruction-Free → Lock-Free → Wait-Free로 갈수록 설계가 어렵습니다. Reader 우선 Lock에서 Reader가 끊이지 않으면 Writer Starvation, Writer 과우선이면 Reader Starvation이 납니다. Short Job만 우선해도 Long Job이 굶을 수 있어 Scheduler의 Aging·Time Slice·Fair/Weighted Queueing이 필요합니다.

Pool · Quota · Bulkhead · 모니터링

사용자별 Queue를 번갈아 비우면 요청 1,000개인 A 뒤에 B 1건이 굶는 일을 줄입니다(Tenant Fairness). Noisy Neighbor에는 Quota·Rate Limit·긴급용 Worker 예약이 있습니다. 기능별 Pool 분리는 Bulkhead와 같습니다. Connection/Thread Pool이 Blocking으로 가득 차면 Pool Starvation으로 사이트가 「멈춘 것처럼」 보일 수 있지만, Deadlock·Saturation과 구분해 Queue Wait·Lock Wait·Retry·Task Age를 모니터링합니다. HOL Blocking은 앞 작업이 뒤를 막는 순서 문제, Starvation은 공정성·선택에서 특정만 배제되는 문제에 가깝습니다. Contention이 있어도 A→B→C→A처럼 돌아가면 Starvation은 아닙니다. Microtask가 끝없이 쌓이면 브라우저에서도 비슷한 「다음 Task가 굶는」 현상이 납니다. CAS 실패 후 즉시 Retry만 반복하지 말고 Backoff·Jitter로 기회를 나눌 수 있습니다. Fairness는 「모두 동일 횟수」가 아니라 「어떤 그룹도 영원히 배제하지 않음」일 수 있습니다(Weighted Fair Queueing).

완화 요약
Aging · Fair / Weighted Queue · Fair Lock
Quota · Rate Limit · Pool 분리(Bulkhead)
Backoff · Timeout · 최소 Capacity 예약

자주 묻는 질문

Starvation이란?

시스템 전체는 동작하지만 특정 Thread·작업이 CPU·Lock·Queue 기회를 계속 얻지 못해 오래 진행하지 못하는 현상입니다.

Deadlock과 차이는?

Deadlock은 관련 작업이 모두 멈춤, Starvation은 다른 작업은 진행하고 특정만 계속 밀림입니다.

Aging이란?

오래 기다릴수록 Priority를 높여 결국 실행 기회를 주는 Starvation 방지 기법입니다.

Lock-Free면 Starvation이 없나?

아닙니다. 전체에서는 누군가 성공해도 특정 Thread가 CAS에서 계속 실패할 수 있습니다. Wait-Free가 더 강한 완료 보장입니다.

Thread Pool Starvation이란?

Pool Worker가 Blocking 등으로 모두 점유되어 새 작업이 오래 실행 기회를 못 얻는 상황입니다.

SEO와 관련 있나?

SEO 전용 개념은 아닙니다. Scheduling·동시성 문제이며 심하면 일부 요청 지연으로 서비스 안정성에 영향을 줄 수 있습니다.

정리

Starvation = 시스템은 계속 동작하지만 특정 Thread·작업만 Resource·실행 기회를 계속 못 얻는 현상입니다. `A·B`만 반복 성공하고 `C`만 대기하는 그림으로 기억하면 됩니다. Aging·Fair Scheduling·Quota·Pool 분리·Backoff로 줄입니다. Starvation Freedom은 「언젠가는 기회를 얻는다」는 보장이며, Equal 처리와는 다를 수 있습니다. 그런데 High Priority H가 필요한 Lock을 Low Priority L이 잡고 있는데, Medium Priority M이 CPU를 계속 쓰면 L이 Lock을 못 풀어 H가 M보다도 늦게 처리되는 이상한 상황이 납니다. 이처럼 높은 Priority 작업이 낮은 Priority가 가진 Resource 때문에 막히며 실제 실행 순서가 뒤집히는 현상Priority Inversion(우선순위 역전)이라고 합니다.