[OS] 프로세스 개요와 PCB, 상태 전이 - 5

2026. 3. 11. 12:52운영체제(OS)

프로세스 개요와 PCB, 상태 전이

프로세스가 무엇인지, OS가 어떻게 관리하는지, 그리고 실행 중에 어떤 상태 변화를 거치는지 정리한다.

💡 핵심: 프로세스는 단순히 "실행 중인 프로그램"이다. OS는 이를 PCB라는 자료구조로 추적하고, 상태 전이를 통해 CPU 자원을 효율적으로 나눠 쓴다.

1. 프로세스란

컴퓨터에서 실행의 대상이 되는 것은 프로그램과 자료다. 프로그램은 소프트웨어에 속하며, 평소에는 HDD나 SSD 같은 보조기억장치1에 저장돼 있다. 실행하려면 이 프로그램을 주기억장치2(RAM)로 옮겨야 한다. 이 과정을 담당하는 것이 OS 안의 로더(Loader)다.

RAM에 올라와 CPU를 사용하거나 기다리고 있는 프로그램, 즉 실행 중인 프로그램을 프로세스라 한다. 프로세스를 처리하는 주체는 프로세서(CPU)다. OS 입장에서 프로세스는 관리의 최소단위이며, 작업(Job) 또는 태스크(Task)라고도 부른다.

보조기억장치
프로그램 저장
로더(Loader)
RAM에 적재
주기억장치(RAM)
프로세스 상주
CPU
실행

컴퓨터 시스템은 시스템 프로세스사용자 프로세스의 집합으로 구성된다. 시스템 프로세스는 OS 코드를 실행하고, 사용자 프로세스는 사용자가 띄운 앱을 실행한다. 이 모든 프로세스는 병행 수행이 가능하다 — 실제로 동시에 돌거나, 번갈아 가며 CPU를 나눠 쓰는 방식으로.

2. PCB (Process Control Block)

OS가 프로세스를 관리하기 위해 프로세스마다 만드는 자료구조가 프로세스 제어 블록(PCB)이다. 프로세스가 생성되는 순간 해당 PCB가 만들어지고, 프로세스가 종료되면 함께 삭제된다. PCB는 OS 커널3 영역에 위치한다.

PCB는 TCB(Task Control Block) 또는 JCB(Job Control Block)이라고도 불린다. 프로세스 상태가 바뀔 때마다 PCB 내용은 트래픽 제어기(Traffic Controller)에 의해 갱신된다.

PCB 구조
포인터
현재 프로세스가 위치한 메모리 주소
프로세스 상태
준비 / 실행 / 대기 등 현재 상태 값
PID
프로세스 고유 식별 번호 (정수값)
프로그램 카운터(PC)
다음에 실행할 명령어의 주소
우선순위 & 스케줄링
CPU 배분 시 사용할 우선순위 정보
CPU 레지스터 정보
누산기, 인덱스 레지스터, 스택 레지스터 등
기억장치 관리 정보
어느 RAM 영역을 사용 중인지 (Base/Bound Register, Page Table 등)
입출력 상태 정보
열린 파일 목록, 사용 중인 I/O 장치
계정 정보
CPU 실제 사용시간, 한정 시간 등
부모 PID / 자식 PID
프로세스 계층 관계 포인터

PCB에서 가장 핵심적인 필드는 프로그램 카운터(PC)CPU 레지스터 정보다. CPU를 빼앗길 때 이 두 값을 PCB에 저장해 뒀다가, 다시 실행될 때 그대로 복원한다. 이 저장-복원 과정이 바로 문맥 교환(Context Switching)이다.

⚠️ 문맥 교환 비용: Context Switching은 PCB를 저장하고 불러오는 순수한 오버헤드다. 이 시간 동안 CPU는 유용한 작업을 전혀 하지 않는다. 프로세스 전환이 잦을수록 오버헤드가 늘어나는 이유다.

3. 프로세스 상태와 전이

프로세스는 생성부터 종료까지 여러 상태를 오가며 CPU와 메모리 자원을 할당받는다. 이 흐름을 프로세스 상태 전이라 한다. 하나의 CPU에서는 오직 한 프로세스만 실행 상태에 있을 수 있고, 나머지는 준비 또는 대기 상태로 큐에서 기다린다.

제출
보류
준비
→ Dispatch  →
실행
완료
↕ Block / Wake-Up
대기(I/O)

각 상태 설명

상태 설명
제출 (Submit) 사용자가 작업을 시스템에 제출한 상태
보류 (Hold) 스풀러가 작업을 디스크에 저장해둔 상태. Job 스케줄러 대기 중
준비 (Ready) RAM에 올라와 CPU를 기다리는 상태. 준비 큐(Ready List)에서 대기
실행 (Run) CPU를 할당받아 실행 중인 상태. 타임 슬라이스 만료 또는 I/O 발생 시 이탈
대기 (Wait/Block) I/O 완료를 기다리는 상태. 우선순위 없이 이벤트 완료 시 준비로 복귀
완료 (Terminated) 실행 종료. CPU 반납, PCB 삭제

상태 전이 트리거

준비
실행
 Dispatch (CPU 할당)
실행
준비
 Time Runout (타임 슬라이스 만료)
실행
대기
 Block (I/O 요청)
대기
준비
 Wake-Up (I/O 완료)

타임 슬라이스와 인터럽트

OS는 각 프로세스에 일정한 CPU 사용 시간(타임 슬라이스)을 준다. 이 시간이 끝나면 시스템 클록이 인터럽트(Interrupt)를 발생시켜 현재 실행 중인 프로세스를 준비 상태로 되돌리고, 다음 프로세스에게 CPU를 넘긴다. 이 메커니즘 덕분에 여러 프로세스가 CPU를 번갈아 쓰면서 동시에 실행되는 것처럼 보인다.

스케줄러 종류

스케줄러 역할 담당 전이
스풀러 (SPOOLer) 제출된 작업을 디스크 스풀 공간에 저장 제출 → 보류
작업 스케줄러 보류 중 작업을 선택해 RAM에 올림 보류 → 준비
프로세스 스케줄러 (CPU 스케줄러) 준비 큐에서 실행할 프로세스를 선택해 CPU 배분 준비 → 실행
트래픽 제어기 모든 프로세스의 상태 추적·관리, 전이 조율 전체
💡 스풀링 vs 버퍼링: 스풀링은 디스크(가상 I/O 장치)를 사용하고, 버퍼링은 주기억장치를 사용한다. 스풀링은 고속 처리 장치와 저속 입출력 장치의 속도 차이를 줄이기 위한 기법이다.

4. Unity 개발자 시점에서

Unity 게임을 실행하면 OS는 Unity 런타임에 대한 프로세스를 생성하고 PCB를 만든다. 게임이 종료되면 PCB가 삭제되며 할당된 메모리와 I/O 자원이 모두 반환된다.

Unity의 게임 로직(Start, Update 등)은 기본적으로 메인 스레드 하나에서 순차 실행된다. 멀티코어 환경에서 성능을 끌어올리려면 Job System을 써야 하는데, Job System은 스레드를 매번 생성하는 대신 워커 스레드 풀을 재사용한다. 스레드를 반복 생성·소멸하면 OS 레벨에서 Context Switching 비용이 누적되기 때문이다.

Unity Process

OS가 관리하는 단일 프로세스 (PCB 1개)

Main Thread

Start / Update / Rendering 등 게임 루프 전체

Worker Threads (Job System)

물리, 애니메이션, 경로탐색 등 병렬 처리 작업

Render Thread / Audio Thread

렌더링·오디오 전용 내부 스레드

Coroutine은 메인 스레드 안에서 실행 흐름을 나눠 쓰는 것이므로 OS 레벨 프로세스 전환과는 무관하다. 반면 async/await는 상황에 따라 OS 스레드를 실제로 사용할 수 있어, Unity API를 메인 스레드 밖에서 호출하면 오류가 난다. Unity API는 스레드 세이프하지 않기 때문이다.

📎 용어 설명

  1. 보조기억장치 — HDD, SSD처럼 전원이 꺼져도 데이터가 유지되는 저장 장치. 용량은 크지만 접근 속도가 RAM보다 느리다.
  2. 주기억장치 — RAM. CPU가 직접 접근할 수 있는 휘발성 메모리. 프로그램이 실행되려면 반드시 RAM에 올라와야 한다.
  3. 커널 — OS의 핵심 부분. 하드웨어 자원(CPU, 메모리, I/O)을 직접 제어하며, 프로세스 관리·스케줄링을 담당한다.
운영체제 프로세스 PCB 프로세스 상태 Context Switching 스케줄러 타임 슬라이스