| 상태 | 설명 |
|---|---|
| New (생성) | 프로세스가 막 생성된 상태 (아직 실행 준비 X) |
| Ready (준비) | CPU를 할당받기 위해 대기 중인 상태 |
| Running (실행) | CPU를 점유하여 명령어를 수행 중인 상태 |
| Waiting / Blocked (대기) | 입출력(I/O) 등 외부 이벤트를 기다리는 상태 |
| Terminated (종료) | 실행이 끝난 상태 (시스템에서 PCB가 제거됨) |
OS는 동시에 여러 프로세스를 관리해야 하기 때문에
각 프로세스가 지금 어떤 상태에 있는지를 추적해야 함
[커널의 프로세스 관리 기능]
프로세스의 상태를 바꾸는 행위 자체는 OS의 커널이 담당함
커널은 이벤트를 감지하여 상태를 바꿈
c.f 이벤트
타임 슬라이스(time slice) 만료
I/O 요청 발생
I/O 완료 인터럽트 발생
새 프로세스 생성 (fork, exec 등)
프로세스 종료
커널 내부의 프로세스 관리 모듈(Process Manager)이 해당 프로세스의 PCB(Process Control Block)를 업데이트하면서 상태를 직접 변경
[스케줄러]
스케줄러는 커널 내부의 의사결정 모듈로
지금 어떤 프로세스를 Running 상태로 만들지 결정함
⇒ 커널: 프로세스의 상태 전이 주체
스케줄러: 어떤 프로세스가 그 전이에 참여할지 결정하는 의사결정 모듈
[스케줄러 종류별 전이 관여 방식]
| 스케줄러 종류 | 담당 전이 | 역할 |
|---|---|---|
| 장기 스케줄러 (Long-term) | New → Ready | 시스템에 프로세스 입장 결정 |
| 단기 스케줄러 (Short-term) | Ready ↔ Running | CPU 점유 프로세스 선택 |
| 중기 스케줄러 (Medium-term) | Suspended ↔ Ready | 프로세스 스와핑(swap in/out) 관리 |

OS가 프로세스의 실행 흐름을 효율적으로 제어하기 위해 상태를 바꿔가며 관리하는 과정
| 상태 전이 | 트리거 | 설명 |
|---|---|---|
| New → Ready | 프로세스 생성 완료 | PCB 생성, 준비 큐 등록 |
| Ready → Running | CPU 스케줄러 선택 | 실행 개시 |
| Running → Waiting | I/O 요청 | CPU 반납, I/O 큐 이동 |
| Waiting → Ready | I/O 완료 | 다시 CPU 대기 상태 |
| Running → Ready | 타임 슬라이스 만료 | CPU 선점, Ready Queue로 복귀 |
| Running → Terminated | 실행 완료 | PCB 제거, 메모리 해제 |
프로세스가 생성되어 PCB가 초기화되고, 실행 가능한 상태가 되었을 때 Ready Queue로 이동
e.g. 사용자가 프로그램 실행 버튼을 누른 직후
CPU 스케줄러가 Ready Queue에서 하나의 프로세스를 선택해 CPU를 할당
CPU 점유권을 얻은 순간
[선점형 스케줄링, Preemptive Scheduling]
우선순위가 높으면 바로 이 전이가 발생할 수 있음
프로세스가 입출력 (I/O) 작업을 요청할 때 발생
CPU는 그 동안 다른 프로세스를 실행시켜야 하므로, 해당 프로세스는 Waiting Queue로 이동
e.g. 파일 읽기, 네트워크 요청, 프린터 출력 등
대기하던 입출력 작업이 완료되면
프로세스는 다시 CPU를 요청할 수 있게 되어 Ready Queue로 돌아감
타임 슬라이스(Time Slice)가 만료되었거나
더 높은 우선순위의 프로세스가 등장하면 (선점형 스케줄링)
현재 프로세스는 다시 Ready 상태로 돌아감
프로세스의 모든 명령이 완료되어 실행이 끝나면
PCB가 정리되고 메모리에서 제거됨
e.g. 프로그램 정상 종료 / 에러 종료
[e.g.] 사용자가 크롬 브라우저를 실행할 때
[상태 전이 & PCB 정보 업데이트 시점]
OS가 프로세스 상태전이를 수행할 때마다 해당 정보를 PCB 안에 업데이트해야, 언제든지 중단 지점 이후로 실행을 재개할 수 있음
| 상태 전이 | PCB에 반영되는 주요 변화 | 업데이트되는 정보 예시 |
|---|---|---|
| New → Ready | PCB 생성 및 초기화 | PID, 초기 프로그램 카운터(PC), 메모리 주소, 우선순위, 상태=Ready |
| Ready → Running | 스케줄러가 CPU 배정 | |
| → PCB의 상태 갱신 | 상태=Running, CPU 점유시간 시작, 스케줄러 타임스탬프 기록 | |
| Running → Waiting | I/O 요청 발생 → 실행 중단, | |
| PCB에 현재 레지스터 값 저장 | 상태=Waiting, 프로그램 카운터(PC), CPU 레지스터 값, 요청된 I/O 장치 ID | |
| Waiting → Ready | I/O 완료 → 다시 실행 준비 상태 | 상태=Ready, I/O 결과 갱신, 스케줄러 우선순위 재조정 |
| Running → Ready | 타임 슬라이스 만료 or CPU 선점 발생 | 상태=Ready, 현재 PC/레지스터 저장, 남은 CPU 시간 기록 |
| Running → Terminated | 프로세스 실행 종료 → PCB 제거 | 상태=Terminated, 자원 해제, CPU 사용 시간, 종료 코드(exit code) 저장 |
OS의 프로세스 실행 흐름은
CPU, I/O 장치, 그리고 스케줄러(scheduler)가 서로 자원을 주고받는 과정
| 구성 요소 | 주요 역할 | 전달/교환하는 자원 |
|---|---|---|
| CPU (중앙처리장치) | 프로세스의 명령어를 실제로 실행 | 연산 시간(Time slice), 프로그램 카운터, 레지스터 |
| I/O 장치 (입출력 장치) | 파일, 네트워크, 디스크, 키보드, 프린터 등 외부 입출력 수행 | 데이터 블록, 버퍼(Buffer), 인터럽트 신호 |
| 스케줄러 (Scheduler) | 어떤 프로세스가 CPU를 사용할지 결정 | 프로세스 우선순위, 큐(Ready Queue, I/O Queue) 관리 |
| 요소 | 역할 | 자원 교환 시점 |
|---|---|---|
| CPU | 연산 수행 | 스케줄러가 프로세스 선택 시 / I/O 요청 시 |
| I/O 장치 | 데이터 입출력 | CPU로부터 요청받을 때 / 완료 후 인터럽트 발생 시 |
| 스케줄러 | CPU 할당·회수 | Ready ↔ Running ↔ Waiting 전이마다 |
CPU는 계산을, I/O는 데이터 처리를, 스케줄러는 자원 분배를 담당하며 이 셋이 계속 순환적으로 자원을 교환
[e.g. 웹브라우저에서 파일 다운로드]
스케줄러가 브라우저 프로세스를 CPU에 올림
Ready → Running
CPU가 네트워크 요청 코드를 실행
파일 다운로드 명령 발견
CPU는 I/O 장치(네트워크 카드) 에 데이터 요청 위임
Running → Waiting
I/O 장치가 데이터를 수신 후 인터럽트를 발생
스케줄러가 프로세스를 Ready로 이동
스케줄러가 다시 CPU에 프로세스를 배정
Ready → Running
CPU가 수신된 데이터를 처리하고 프로그램 종료
Running → Terminate