2025-09-25 23:35
-
운영체제에서 특정 프로세스가 필요한 자원을 계속 할당받지 못해 무한정 대기하는 현상을 기아 상태라고 한다.
-
기아 상태는 주로 우선순위 기반 스케줄링에서 발생하며, 높은 우선순위의 프로세스들이 계속해서 시스템 자원을 독점할 때 낮은 우선순위의 프로세스가 굶주리게 된다.
-
이 문제의 대표적인 해결책은 ‘에이징(Aging)’ 기법으로, 오랫동안 대기한 프로세스의 우선순위를 점진적으로 높여 언젠가는 실행될 기회를 보장하는 방식이다.
운영체제 기아 상태 완벽 정복 핸드북
컴퓨터의 운영체제(OS)는 수많은 프로세스들이 원활하게 작동하도록 조율하는 지휘자와 같다. 하지만 이 지휘 과정에서 몇몇 프로세스들이 계속해서 외면당하고 무대(CPU)에 오르지 못하는 비극이 발생하기도 한다. 이를 기아 상태(Starvation) 또는 **무한 봉쇄(Indefinite Blocking)**라고 부른다. 이 핸드북은 운영체제의 기아 상태가 무엇인지, 왜 발생하는지, 그리고 어떻게 해결할 수 있는지에 대한 깊이 있는 통찰을 제공한다.
1부 기아 상태란 무엇인가?
기아 상태의 탄생 배경
현대의 운영체제는 여러 작업을 동시에 처리하는 다중 프로그래밍(Multi-programming) 환경을 기본으로 한다. 이는 마치 한 명의 요리사가 여러 손님의 주문을 동시에 처리하는 것과 같다. CPU라는 단일 자원(혹은 제한된 수의 자원)을 여러 프로세스가 나누어 사용해야 하므로, 어떤 프로세스에게 CPU를 할당할지 결정하는 스케줄링 정책이 필수적이다.
이때 스케줄러는 효율성을 위해 ‘중요도’나 ‘긴급성’ 같은 기준을 사용하는데, 이것이 바로 **우선순위(Priority)**이다. 중요한 작업을 먼저 처리하는 것은 합리적이지만, 만약 중요하고 긴급한 작업이 끊임없이 들어온다면 어떻게 될까? 상대적으로 덜 중요하다고 판단된 작업은 영원히 자신의 차례를 기다려야 할지도 모른다. 이처럼 특정 프로세스가 시스템 자원(주로 CPU 시간)을 할당받을 기회를 지속적으로 박탈당해 실행되지 못하는 상태가 바로 기아 상태다.
기아 상태의 정의
**기아 상태(Starvation)**는 시스템 내에서 특정 프로세스의 우선순위가 낮아 다른 프로세스들에게 계속해서 자원을 빼앗겨, 무한정으로 기다리게 되는 상태를 의미한다.
비유를 들어보자. 매우 붐비는 식당에 예의 바른 손님 A가 도착했다고 가정하자. A는 순서대로 줄을 서서 기다리지만, 그때마다 “매우 급한 손님” 혹은 “VIP 손님”이 나타나 계속해서 A의 앞으로 새치기를 한다. 식당 주인이 이 VIP들을 먼저 응대하는 동안, A는 하염없이 기다리게 된다. 만약 VIP 손님들이 끊이지 않고 계속 온다면, A는 영원히 식사를 하지 못하고 굶주리게 될 것이다. 여기서 A가 바로 기아 상태에 빠진 프로세스다.
2부 기아 상태는 왜 발생하는가?
기아 상태는 특정 조건 하에서 발생하는 필연적인 문제다. 주요 원인은 다음과 같다.
1. 엄격한 우선순위 스케줄링 (Strict Priority Scheduling)
가장 흔하고 직접적인 원인이다. 우선순위 스케줄링 알고리즘은 각 프로세스에 부여된 우선순위 값에 따라 실행 순서를 결정한다. 준비 큐(Ready Queue)에 여러 프로세스가 있을 때, 스케줄러는 항상 가장 높은 우선순위를 가진 프로세스를 선택한다.
문제는 새로운 고순위 프로세스가 계속해서 시스템에 진입하는 경우다. 낮은 우선순위를 가진 프로세스는 실행될 기회를 잡기도 전에 자신보다 높은 우선순위의 새로운 프로세스에게 계속해서 순서를 양보해야 한다. 이 과정이 반복되면 저순위 프로세스는 영원히 CPU를 할당받지 못하는 기아 상태에 빠진다.
예를 들어, 실시간 시스템에서 사용자 입력 처리(고순위)나 네트워크 패킷 처리(고순위) 같은 작업들이 계속해서 발생하면, 파일 백업(저순위)이나 시스템 로그 정리(저순위) 같은 작업은 무한정 지연될 수 있다.
2. 자원 할당의 불균형
기아 상태는 CPU 시간뿐만 아니라 다른 시스템 자원(메모리, 입출력 장치 등)의 할당 과정에서도 발생할 수 있다. 특정 프로세스들이 자원을 점유하고 놓아주지 않거나, 자원 관리 정책이 특정 프로세스 그룹에게만 유리하게 작용할 때 발생할 수 있다.
흔히 혼동하는 개념: 교착 상태(Deadlock) vs 기아 상태(Starvation)
기아 상태는 **교착 상태(Deadlock)**와 자주 혼동되지만, 둘은 근본적으로 다른 문제다.
-
교착 상태: 두 개 이상의 프로세스가 서로가 점유한 자원을 기다리며 다음 단계로 진행하지 못하고 영원히 멈춰있는 상태. 모든 관련 프로세스가 함께 멈춘다. 순환 대기(Circular Wait) 조건이 핵심이다.
-
기아 상태: 특정 프로세스 하나가 자원을 할당받지 못해 진행하지 못하는 상태. 다른 프로세스들은 정상적으로 실행될 수 있다. 시스템 전체가 멈추는 것은 아니다.
아래 표는 두 개념의 차이를 명확히 보여준다.
| 구분 | 교착 상태 (Deadlock) | 기아 상태 (Starvation) |
|---|---|---|
| 상태 | 모든 관련 프로세스가 진행 불가 (Blocked) | 특정 프로세스만 진행 불가, 다른 프로세스는 실행 중 |
| 원인 | 상호 배제, 점유와 대기, 비선점, 순환 대기 | 불공정한 스케줄링 정책 (주로 우선순위) |
| 영향 | 시스템의 일부 또는 전체가 멈춤 | 시스템 성능 저하, 특정 작업의 무한 지연 |
| 비유 | 두 사람이 외나무다리 양 끝에서 서로 비켜주길 기다리는 상황 | 한 사람이 계속해서 다른 사람에게 길을 양보하다가 목적지에 도착하지 못하는 상황 |
3부 기아 상태를 해결하는 방법
운영체제 설계자들은 이 불공정한 ‘굶주림’을 방지하기 위해 여러 해결책을 고안했다. 핵심 아이디어는 **‘공정성(Fairness)‘**을 보장하는 것이다.
1. 에이징 (Aging)
기아 상태를 해결하는 가장 대표적이고 효과적인 기법은 **에이징(Aging)**이다. 이름 그대로, 프로세스가 시스템에서 대기하는 시간이 길어질수록 ‘나이’를 먹게 하고, 이 나이에 비례하여 우선순위를 점진적으로 높여주는 방식이다.
작동 원리:
-
프로세스가 준비 큐에서 일정 시간 이상 대기하면, 운영체제는 해당 프로세스의 우선순위를 한 단계 높인다.
-
이 과정은 주기적으로 반복된다.
-
아무리 낮은 우선순위를 갖고 시스템에 진입한 프로세스라도, 충분히 오래 기다리면 결국에는 가장 높은 우선순위를 갖게 된다.
-
최고 우선순위를 획득한 프로세스는 마침내 CPU를 할당받아 실행될 기회를 보장받는다.
이는 마치 은행 대기 시스템과 같다. 번호표를 뽑고 오래 기다린 고객일수록 창구에 불릴 확률이 높아지는 것과 같은 원리다. 에이징 기법은 저순위 프로세스가 무한정 대기하는 것을 방지하고, 모든 프로세스가 언젠가는 실행될 것임을 보장하는 효과적인 해결책이다.
2. 공정한 스케줄링 알고리즘 사용
애초에 기아 상태를 유발할 가능성이 적은 스케줄링 알고리즘을 사용하는 것도 방법이다.
-
라운드 로빈 (Round Robin) 스케줄링: 모든 프로세스에게 공평하게 동일한 크기의 시간 할당량(Time Quantum)을 부여하고, 큐를 순환하며 실행한다. 우선순위 개념이 없으므로 어떤 프로세스도 무한정 기다리지 않는다. 마치 여러 아이들에게 돌아가면서 장난감을 가지고 놀게 하는 것과 같다.
-
다단계 큐 (Multi-level Queue) 스케줄링: 우선순위별로 여러 개의 큐를 두고, 큐 사이를 프로세스가 이동할 수 있게 설계하여 에이징과 유사한 효과를 낼 수 있다. 예를 들어, 특정 큐에서 너무 오래 대기한 프로세스를 더 높은 우선순위의 큐로 이동시키는 규칙을 추가할 수 있다.
4부 심화 내용 및 실제 사례
식사하는 철학자 문제 (Dining Philosophers Problem)
기아 상태를 설명할 때 자주 등장하는 고전적인 동시성 문제다. 5명의 철학자가 원형 식탁에 앉아 있고, 각 철학자 사이에는 포크가 하나씩 놓여 있다. 철학자가 식사하려면 자신의 왼쪽과 오른쪽 포크를 모두 집어야 한다.
만약 특정 철학자가 포크를 집으려고 할 때마다 양옆의 철학자들이 먼저 포크를 가져가 버리는 상황이 계속 반복된다면, 그 철학자는 영원히 식사를 하지 못하고 굶어 죽게 된다. 이는 교착 상태(모든 철학자가 왼쪽 포크만 집고 오른쪽 포크를 기다리는 상황)와는 다른, 기아 상태의 좋은 예시가 될 수 있다.
현대 운영체제의 노력
현대의 운영체제 스케줄러는 기아 상태를 방지하기 위해 매우 정교하게 설계되어 있다.
- 리눅스(Linux)의 CFS (Completely Fair Scheduler): 리눅스 커널 2.6.23부터 도입된 CFS는 전통적인 우선순위 방식 대신, 각 프로세스가 CPU를 사용한 ‘가상 런타임(virtual runtime)‘을 추적한다. CFS는 항상 이 가상 런타임이 가장 적은 프로세스, 즉 CPU를 가장 적게 사용한 프로세스에게 실행 기회를 준다. 이를 통해 모든 프로세스가 CPU 시간을 공평하게 분배받도록 보장하며, 기아 상태의 발생 가능성을 원천적으로 차단한다. 이는 ‘누가 가장 중요한가’가 아닌 ‘누가 가장 굶주렸는가’를 기준으로 삼는 것과 같다.
결론
기아 상태는 다중 프로그래밍 환경에서 효율성을 추구하는 과정에서 발생하는 그림자와 같다. 특히 우선순위 기반의 스케줄링 정책은 자칫 잘못하면 일부 프로세스를 무한한 기다림의 나락으로 빠뜨릴 수 있다.
하지만 운영체제는 에이징이라는 현명한 해결책을 통해 ‘기다림의 가치’를 인정하고, 모든 프로세스에게 언젠가는 실행될 것이라는 희망을 준다. 더 나아가 리눅스의 CFS와 같은 현대 스케줄러들은 공정성 자체를 핵심 철학으로 삼아 기아 문제를 근본적으로 해결하려 노력하고 있다.
개발자나 시스템 관리자는 이러한 기아 상태의 개념을 이해함으로써, 시스템이 특정 작업에 대해 비정상적으로 느리게 반응할 때 그 원인을 진단하고, 프로세스의 우선순위를 적절히 조정하여 시스템의 반응성과 안정성을 높이는 데 기여할 수 있다. 결국, 좋은 운영체제란 가장 빠른 프로세스뿐만 아니라 가장 느린 프로세스까지도 세심하게 보살피는 시스템이라 할 수 있다.