프로세스의 상태 전이
프로세스의 상태 전이는 어떻게 이루어질까?
프로세스 상태 다이어그램
전통적인 운영체제에서 프로세스가 거치는 모든 상태 전이에 대한 다이어그램입니다.
- 윗부분(활성 상태)은 CPU 스케줄러의 즉시 대상이 될 수 있는 상태들이며,
- 아랫부분(비활성 상태)은 메모리에서 내려가 디스크(스왑 영역)에 보관되는 상태들입니다.
프로세스 상태의 분류
운영체제 관점에서 프로세스 상태는 크게 활성(Resident) 상태와 비활성(Non-Resident) 상태로 나눌 수 있습니다.
활성 상태 (Resident States)
- 준비(Ready) CPU 할당만을 기다리는 상태입니다. 프로세스의 주소 공간(code, data, stack)과 PCB(Process Control Block)가 메모리에 상주하며, 스케줄러가 언제든지 Dispatch할 수 있게 됩니다.
- 실행(Running) 실제 CPU 레지스터에 맵핑되어 명령어를 수행 중인 상태입니다. 타이머 인터럽트 또는 I/O 요청으로 곧 빠져나올 수 있습니다.
- 대기(Waiting / Blocked) I/O 완료나 특정 이벤트(예: 입출력, 동기화 오브젝트 신호)를 기다리며 CPU 사용권을 자발적으로 반납한 상태입니다. 이벤트가 발생하면 준비 상태로 돌아갑니다.
비활성 상태 (Non-Resident States)
- 지연준비(Suspended-Ready) 준비 상태에 있던 프로세스를 메모리 부족·다중 프로그래밍 정도 조절 목적으로 디스크로 스와핑한 상태입니다.
- 지연대기(Suspended-Blocked) 대기 상태에 있던 프로세스를 스와핑 아웃한 경우입니다. I/O 완료 인터럽트가 발생해도 즉시 활성화되지 않고, 먼저 메모리로 복귀되어야 합니다.
- 종료(Terminated)
exit()호출 또는 치명적 오류로 프로세스 생명 주기가 끝난 상태입니다. PCB가 소멸되고 프로세스 자원이 회수됩니다.
스케줄러와 전이
활성 상태에서 프로세스가 어떻게 이동하는지 살펴보겠습니다.
Dispatch (Schedule)
- 준비 큐(Ready Queue)에서 다음 실행할 프로세스를 선택하여 CPU에 배치합니다.
- PCB에 저장된 레지스터 값과 프로그램 카운터(PC)를 복원하고 문맥 교환(Context Switch)이 일어나게 됩니다.
Time-Out (Preemption)
- 타이머 인터럽트가 도달하면 현재 실행 중이던 프로세스를 다시 준비 상태로 전이합니다.
- Round-Robin, Priority with Time-Slice 등 선점형 스케줄링 기법이 적용됩니다.
Sleep / Block
- 프로세스가 디스크 I/O,
sleep()호출, 동기화 오브젝트 대기 등으로 자발적으로 CPU를 반납합니다. - 이때 프로세스는 대기 큐(Blocked Queue)에 삽입되고, CPU는 다른 프로세스로 넘어갑니다.
- 프로세스가 디스크 I/O,
Wakeup
- I/O 완료 인터럽트나 다른 프로세스의 signal/notify가 발생하면, 해당 프로세스는 대기 큐에서 꺼내져 준비 큐로 전이됩니다.
- 다음 Dispatch 대상이 될 준비가 완료됩니다.
Exit
exit(), 예외 발생,kill()신호 등으로 프로세스가 종료됩니다.- 종료된 프로세스는 시스템 콜을 통해 자원 해제 후 PCB가 제거되며, 부모 프로세스에게 종료 상태가 통보됩니다.
지연 상태와 중간 스케줄링
메모리 관리 차원에서 중기 스케줄러(Medium-term Scheduler) 가 개입하여, 시스템의 다중 프로그래밍 정도를 조절하게 됩니다.
- Swap-Out (Suspend)
- 활성 상태(준비 또는 대기)에 있는 프로세스를 디스크의 스왑 영역으로 옮겨 비활성화합니다.
- 메모리 사용량을 줄여, 새로운 프로세스 진입 또는 캐시 페이지 확보에 여유를 만듭니다.
Swap-In (Resume)
- 디스크에 보관된 지연 상태 프로세스를 다시 메모리로 불러옵니다.
- 원래 대기 상태였던 프로세스는 대기 큐에, 준비 상태였던 프로세스는 준비 큐에 복귀합니다.
이를 통해 시스템은 메모리에 상주할 프로세스 수를 조정하며 과도한 스래싱(thrashing) 위험을 낮추게 됩니다.
Swap-Out (Suspend)과 Swap-In (Resume)이 일어나는 시점
1. Swap-Out (Suspend)이 발생하는 경우
메모리 압박(memory pressure) 상황
- 시스템의 유휴 물리 메모리가 낮은 임계치(lo-watermark) 아래로 떨어질 때
- 중기 스케줄러(또는 Linux의
kswapd데몬)가 활성화되어, 메모리 사용량을 낮추기 위해 일부 프로세스를 디스크로 옮깁니다.
Watermark 메모리 존(zone)마다 정의된 임계치로 lo-watermark 아래로 내려가면 즉시 페이지 회수를 트리거하게 되고 high-watermark는 페이지 회수를 마친 뒤 반드시 확보해야 할 여유 메모리 목표치입니다.
kswapd “kernel swap daemon”의 약자로,프리 메모리가 lo-watermark 이하로 떨어지면 깨워져 동작하며 LRU 페이지를 회수, 스왑 아웃해 high-watermark까지 메모리를 복구하는 백그라운드 커널 스레드입니다.
장시간 Block 또는 Sleep 상태
- 프로세스가 I/O 대기,
sleep()호출, 락(lock) 획득 대기 등으로 장시간 CPU를 사용하지 않을 때 - 메모리에 머무르는 것이 비효율적이라 판단되면, 준비(Ready)·대기(Blocked) 상태 프로세스 중 우선순위가 낮거나 오래 기다린 대상을 스왑 아웃합니다.
- 프로세스가 I/O 대기,
다중 프로그래밍 정도(Degree of Multiprogramming) 조절
- 한꺼번에 너무 많은 프로세스가 메모리에 올라와 스래싱(thrashing)이 우려될 때
- 시스템 전체 처리량(throughput)을 높이기 위해, 일부 프로세스를 비활성화하여 활성 프로세스 수를 제한합니다.
2. Swap-In (Resume)이 발생하는 경우
프로세스 Wakeup 요청 시
- Block 상태였던 프로세스가 I/O 완료 인터럽트나
signal/notify를 통해 다시 실행 준비가 될 때 - 디스크에 스왑 아웃된 프로세스가 있다면, 우선적으로 메모리로 복귀시켜 준비 큐(Ready Queue)에 넣습니다.
- Block 상태였던 프로세스가 I/O 완료 인터럽트나
메모리 여유(free memory) 확보 시
- 물리 메모리가 high-watermark 이상으로 회복되면
kswapd또는 중기 스케줄러가 디스크에 있던 프로세스를 메모리로 불러와,- 이전에 준비 상태였던 프로세스는 준비 큐로
- 이전에 대기 상태였던 프로세스는 대기 큐로 복귀시킵니다.
프로세스 우선순위 상승 또는 수동 Resume 요청
- 관리자가
resume명령을 내려 특정 스왑 아웃 프로세스를 즉시 메모리에 복구할 수도 있습니다. - 이 경우에도 메모리 여유가 전제되어야 하기 때문에, 필요 시 추가 스왑-아웃이 선행될 수 있습니다.
- 관리자가
내부적 동작
프로세스 상태 전이를 가능케 하는 OS 내부 구조를 살펴보겠습니다.
PCB (Process Control Block)
문맥 교환(Context Switch)
인터럽트 및 예외 처리
- 타이머 인터럽트: 선점형 스케줄링 구현의 핵심입니다.
- I/O 인터럽트: 디바이스 드라이버가 완료 신호를 OS에 전달하여 대기 중인 프로세스를 깨웁니다.
- 페이지 폴트(Page Fault): 가상 메모리 환경에서 발생하며, 해당 페이지를 디스크에서 메모리로 로드한 뒤 준비 상태로 전이됩니다.
스케줄링 알고리즘
- FCFS, SJF, Priority, RR, Multilevel Queue 등 다양한 기법이 존재합니다.
- 각 기법은 응답 시간, 처리량(throughput), 공정성(fairness), 오버헤드 측면에서 트레이드오프를 가집니다.


