프로세스 상태 전이와 스케줄러·큐의 동작 구조
프로세스의 New·Ready·Run·Sleep·Terminated 상태와 상태 전이, 스케줄러, 큐 관리, Swap 동작을 정리합니다.
2026-08-14 · 최초 발행 2026-01-03
CPU를 기다리는 상태와 이벤트를 기다리는 상태
프로세스는 생성 직후부터 종료될 때까지 하나의 상태에 머물며, CPU가 필요한지 또는 외부 이벤트를 기다리는지에 따라 다음 상태로 옮겨 간다. 일반적인 모델은 New, Ready, Run, Sleep, Terminated로 구성된다.
Ready 상태의 프로세스는 실행 준비를 끝냈지만 CPU 할당을 기다린다. 반면 Sleep 상태는 I/O나 동기화 이벤트가 끝나기 전에는 CPU를 받아도 실행할 수 없다. 운영체제는 PCB에 현재 상태를 기록하고, 상태 전이를 통해 프로세스의 생명 주기를 관리한다.
상태 모델은 필요에 따라 다음처럼 단순화하거나 확장한다.
- 3-State 모델: Ready, Run, Blocked로 구성되는 교육용의 단순한 모델
- 5-State 모델: New, Ready, Run, Sleep, Terminated를 포함하는 일반적인 모델
- 7-State 모델: 5-State 모델에 Suspend Ready와 Suspend Wait를 추가해 가상 메모리 환경의 Swap Out/In을 반영하는 모델
생성부터 종료까지 이어지는 상태
New: 프로세스를 준비하는 단계
New는 프로세스가 생성되는 동안의 상태다. 운영체제는 이 시점에 PCB를 만들고, PID를 할당하며, 메모리와 필요한 자원을 초기화한다. 초기화가 끝나면 프로세스는 Ready 상태로 들어간다.
Ready: CPU 할당만 남은 상태
Ready 상태에서는 실행에 필요한 준비가 완료되어 있고 CPU만 기다린다. 여러 프로세스가 동시에 Ready 상태에 있을 수 있으며, 스케줄러는 우선순위와 스케줄링 알고리즘에 따라 다음 대상을 고른다.
Ready Queue는 FIFO, Priority Queue 등의 구조로 구성할 수 있다. 어떤 구조를 사용하는지는 스케줄링 알고리즘에 따라 달라진다.
Run: 명령어를 수행하는 상태
Run 상태는 CPU를 할당받아 실제 명령어를 실행하는 구간이다. 단일 CPU에서는 한 번에 하나의 프로세스만 Run 상태가 된다. 이 과정에서 명령어 Fetch, Decode, Execute와 레지스터 업데이트가 수행된다.
타임 슬라이스가 끝나거나 인터럽트가 발생하면 Ready로 돌아갈 수 있다. I/O를 요청하면 Sleep으로, 실행을 마치면 Terminated로 전이한다.
Sleep: 이벤트가 필요한 상태
Sleep은 I/O 완료 또는 특정 이벤트를 기다리는 상태다. CPU를 배정받더라도 바로 실행할 수 없으며 Wait Queue에서 대기한다.
대기 원인에는 파일 읽기·쓰기를 위한 디스크 I/O, 패킷 송수신을 위한 네트워크 I/O, 키보드 입력, 자식 프로세스 종료를 기다리는 wait, 세마포어와 뮤텍스 대기가 있다. Wait Queue는 I/O 장치별 또는 이벤트별로 둘 수 있고 FIFO나 우선순위 방식으로 관리한다. I/O가 끝나거나 이벤트가 발생하면 프로세스는 Ready 상태로 이동한다.
Terminated: 실행은 끝났지만 정리가 남은 상태
Terminated는 프로세스 실행이 완료된 뒤 자원 해제와 PCB 삭제를 기다리는 상태다. 정상 종료인 exit, Segmentation Fault 같은 오류 종료, kill에 의한 강제 종료가 여기에 해당한다.
운영체제는 메모리를 해제하고 열린 파일을 닫은 뒤 부모 프로세스에 종료 상태를 전달하며 PCB를 삭제한다.
상태를 바꾸는 이벤트
New에서 Ready로의 전이는 Admit이다. 프로세스 초기화, 메모리 할당, PCB 생성이 완료되었을 때 발생하며, Long-term Scheduler(Job Scheduler)는 시스템 부하를 고려해 이 전이를 결정한다.
Ready에서 Run으로 가는 Dispatch에서는 스케줄러가 프로세스를 선택하고 CPU 사용 가능 여부와 우선순위를 확인한다. 선택된 프로세스는 Context Switching 과정에서 PCB에 저장된 레지스터와 프로그램 카운터(PC)를 복원한 뒤 실행을 재개한다.
선점형 환경에서는 타임 슬라이스 만료, 더 높은 우선순위 프로세스의 Ready 전환, 인터럽트 발생으로 Run에서 Ready로 돌아갈 수 있다. 현재 프로세스의 상태는 PCB에 저장되고 Ready Queue에 다시 삽입된다.
Run에서 Sleep으로 가는 Event Wait는 read, write 같은 I/O 요청, 세마포어·뮤텍스 대기, 자식 프로세스 종료 대기에서 발생한다. 프로세스는 Wait Queue로 이동하고 CPU는 다른 프로세스에 할당된다. I/O 완료 인터럽트나 이벤트 발생, 동기화 객체 획득 가능 상태는 Event Completion으로 이어져 Sleep의 프로세스를 Ready Queue에 넣는다.
Run에서 Terminated로의 Exit는 exit() System Call, 프로그램 끝 도달, Segmentation Fault 같은 치명적 오류, kill에 의해 일어난다. 이때 운영체제는 자원을 해제하고 부모에게 종료 상태를 전달한다.
메모리 밖으로 나간 프로세스까지 다루는 모델
7-State 모델은 메모리가 부족할 때 프로세스를 디스크로 내보내는 상황을 표현한다.
Suspend Ready는 Ready 상태였지만 Swap Out되어 메모리에 없는 프로세스다. CPU는 필요하지만 메모리에 없으며, 메모리 부족, 낮은 우선순위, 시스템 부하 감소 필요 상황에서 발생할 수 있다. Ready에서 Suspend Ready로는 Swap Out, 반대 방향은 Swap In이다.
Suspend Wait는 Sleep 상태의 프로세스가 디스크로 Swap Out된 상태다. I/O를 기다리는 중이고 메모리에는 없다. 메모리 부족이나 장기간 I/O 대기에서 발생하며, I/O가 완료되어도 메모리에 남아 있지 않으면 Suspend Ready로 옮겨 간다.
Swap Out은 프로세스를 메모리에서 디스크로 옮겨 공간을 확보하고 페이지 테이블을 업데이트한다. Swap In은 프로세스를 디스크에서 메모리로 가져와 실행 재개를 준비하고 페이지 테이블을 갱신한다. Mid-term Scheduler는 이 Swap Out/In을 결정하고 메모리 사용량과 멀티프로그래밍 정도를 관리한다.
큐와 Dispatcher가 맡는 일
Job Queue는 시스템에 존재하는 모든 프로세스를 포함하며 New, Ready, Run, Sleep 상태의 프로세스가 대상이다. Long-term Scheduler는 이 큐를 관리하며 새 프로세스의 Admit 여부를 결정한다.
Ready Queue는 다음에 CPU를 사용할 프로세스를 보관한다. 큐, 우선순위 큐, 다단계 큐 형태를 사용할 수 있고 FIFO, Round Robin, Priority 등의 방식으로 다음 실행 대상을 선택한다.
Ready Queue: [P1, P3, P5, P7]
→ Dispatcher가 P1 선택 → Run
Wait Queue는 I/O 장치별 또는 이벤트별로 구성된다. I/O가 끝나면 해당 프로세스를 Ready Queue로 옮긴다.
Disk Wait Queue: [P2, P4]
→ Disk I/O 완료 (P2) → Ready Queue
Dispatcher는 Ready Queue에서 선택된 프로세스에 CPU 제어를 넘긴다. 스케줄러가 다음 프로세스를 선택하면 Dispatcher는 현재 프로세스 상태를 PCB에 저장하고, 다음 프로세스의 PCB에서 상태를 복원한다. 이어 프로그램 카운터(PC)를 설정해 실행을 재개한다.
선점형 스케줄링은 실행 중인 프로세스를 강제로 중단할 수 있어 Run에서 Ready로의 전이가 발생한다. Round Robin, Preemptive Priority Scheduling, Multilevel Feedback Queue가 여기에 속한다. 응답 시간과 공정성은 개선되지만 Context Switching 오버헤드와 복잡성은 증가한다.
비선점형 스케줄링에서는 프로세스가 자발적으로 CPU를 반납한다. Run에서 Ready로의 전이는 없고 I/O 또는 종료가 발생할 때만 CPU를 내놓는다. FIFO(First In First Out), SJF(Shortest Job First), Non-preemptive Priority Scheduling이 이에 해당한다. Context Switching 오버헤드는 작고 구현은 단순하지만, 응답 시간이 늘어나거나 긴 프로세스가 CPU를 독점할 수 있다.
운영 환경에서 확인하는 상태 표기
Linux의 ps 명령에서는 프로세스 상태를 다음 코드로 확인할 수 있다.
- R (Running): Run 또는 Ready
- S (Sleeping): Interruptible Sleep
- D (Disk Sleep): Uninterruptible Sleep
- T (Stopped): 일시 정지
- Z (Zombie): Terminated 상태에서 부모의
wait를 기다리는 상태
$ ps aux
USER PID %CPU %MEM VSZ RSS STAT START TIME COMMAND
root 1 0.0 0.1 169496 11384 Ss 10:00 0:01 /sbin/init
user 1234 0.5 2.3 234567 98765 R+ 10:05 0:10 python app.py
user 5678 0.0 0.5 123456 23456 S 10:10 0:00 /bin/bash
STAT 필드에서 S는 Sleeping, R은 Running, D는 Disk Wait, +는 Foreground를 뜻한다.
Windows Task Manager는 Running, Suspended, Not Responding 상태를 표시한다. Not Responding은 보통 I/O 대기 상황과 연결된다. Process Explorer에서는 더 상세한 정보와 Thread State를 확인할 수 있다.