PCB와 프로세스 상태 전이: 운영체제의 실행 단위 관리
PCB 구조, 프로세스 상태 전이, 컨텍스트 스위칭과 프로세스 큐를 중심으로 운영체제가 실행 단위를 관리하는 방식을 정리한다.
2026-08-14 · 최초 발행 2026-01-16
디스크의 프로그램이 실행 단위가 되는 순간
프로세스는 메모리에 올라와 실행 중인 프로그램의 인스턴스다. 디스크에 보관된 프로그램 코드만으로는 실행 상태나 자원 사용 내역을 알 수 없지만, 프로세스에는 실행에 필요한 컨텍스트가 함께 포함된다.
운영체제는 이를 가장 기본적인 작업 단위로 다룬다. 여러 프로세스가 CPU를 번갈아 사용하고 입출력 완료를 기다리는 환경에서, 프로세스 관리는 CPU 활용률과 사용자 응답성을 좌우한다.
| 구분 | 프로그램(Program) | 프로세스(Process) |
|---|---|---|
| 상태 | 정적(Static) | 동적(Dynamic) |
| 저장 위치 | 디스크(보조기억장치) | 메모리(주기억장치) |
| 생명주기 | 영구적 | 일시적 |
| 자원 할당 | 없음 | CPU, 메모리, I/O 등 |
| 실행 | 불가능 | 가능 |
각 프로세스는 독립된 가상 주소 공간을 사용한다. 실행 코드와 전역 데이터, 동적 할당 영역, 함수 호출 정보가 한 주소 공간 안에서 다음과 같이 배치된다.
| 영역 | 설명 | 특징 |
|---|---|---|
| Text | 실행할 프로그램 코드 | 읽기 전용, 공유 가능 |
| Data | 초기화된 전역/정적 변수 | 읽기/쓰기 가능 |
| BSS | 초기화되지 않은 변수 | 0으로 초기화 |
| Heap | 동적 할당 메모리 | 런타임에 크기 변경 |
| Stack | 함수 호출 정보, 지역변수 | LIFO 구조, 자동 관리 |
PCB에는 다음 실행을 위한 정보가 남는다
운영체제가 프로세스를 추적하기 위해 유지하는 자료구조가 PCB(Process Control Block)다. 프로세스 테이블의 각 엔트리로 존재하며, 프로세스마다 하나의 PCB가 생성된다. 프로세스의 현재 상태뿐 아니라 CPU를 다시 배정받았을 때 어느 명령부터 이어서 실행해야 하는지도 PCB에서 찾는다.
| 항목 | 설명 | 예시 |
|---|---|---|
| 프로세스 ID | 프로세스 고유 식별자 | PID 1234 |
| 프로세스 상태 | 현재 실행 상태 | Ready, Running, Waiting |
| 프로그램 카운터 | 다음 실행할 명령어 주소 | 0x00401000 |
| CPU 레지스터 | 레지스터 값들의 집합 | EAX, EBX, ESP, EBP 등 |
| 스케줄링 정보 | 우선순위, 스케줄링 큐 포인터 | 우선순위 10, Ready Queue |
| 메모리 관리 정보 | 페이지 테이블, 세그먼트 테이블 | 베이스/리미트 레지스터 |
| 입출력 상태 | 할당된 I/O 장치, 열린 파일 | 파일 디스크립터 목록 |
| 계정 정보 | CPU 사용 시간, 시간 제한 | 총 CPU 시간 2.5초 |
CPU가 실행 대상을 바꾸는 컨텍스트 스위칭에서는 현재 프로세스의 상태를 PCB에 저장하고, 선택된 프로세스의 PCB에서 상태를 복원한다.
이 전환에는 레지스터 저장·복원과 PCB 갱신이라는 직접 비용이 든다. 캐시와 TLB 무효화로 캐시 미스가 늘어나는 간접 비용도 발생한다. 시간 비용은 일반적으로 수 마이크로초이며, PCB 크기를 최소화하고 하드웨어 지원을 활용하는 방식으로 오버헤드를 줄일 수 있다.
실행과 대기를 오가는 상태 전이
프로세스는 생성된 뒤 CPU를 기다리고, 실행되며, 입출력이나 이벤트를 기다렸다가 종료된다. 운영체제는 이 상태를 PCB에 기록하고 전이 조건에 따라 스케줄링 대상과 자원 할당을 바꾼다.
| 상태 | 영문 표기 | 설명 | PCB 위치 |
|---|---|---|---|
| 생성 | New | 프로세스 생성 중, PCB 초기화 | 생성 중 |
| 준비 | Ready | CPU 할당 대기 중 | Ready Queue |
| 실행 | Running | CPU에서 명령어 실행 중 | CPU |
| 대기 | Waiting/Blocked | I/O 또는 이벤트 대기 | Wait Queue |
| 종료 | Terminated | 실행 완료, 자원 해제 중 | 해제 대기 |
| 전이 | 원인 | 설명 |
|---|---|---|
| New → Ready | Admit | 프로세스 생성 완료, 스케줄링 가능 상태 |
| Ready → Running | Dispatch | 스케줄러가 프로세스 선택, CPU 할당 |
| Running → Ready | Timeout | 타임 슬라이스 만료, 선점 발생 |
| Running → Waiting | I/O Request | 입출력 요청으로 인한 대기 |
| Waiting → Ready | I/O Complete | 입출력 완료, 다시 스케줄링 대상 |
| Running → Terminated | Exit | 정상 종료 또는 강제 종료 |
실제 운영체제는 메모리 상태까지 반영해 더 세분화된 모델을 사용할 수 있다. Suspended 상태는 메모리 부족이나 사용자 요청으로 프로세스를 디스크로 스왑 아웃한 상태다.
| Suspended 상태 | 설명 |
|---|---|
| Suspended Ready | 메모리에서 제거되었지만 준비 상태 |
| Suspended Waiting | 메모리에서 제거되었고 이벤트 대기 중 |
스케줄러가 보는 대기열
운영체제는 프로세스를 상태별 큐에 연결해 관리한다. Job Queue에는 시스템 내 모든 프로세스가 놓이고, Ready Queue에는 CPU 할당을 기다리는 프로세스가 들어간다. 장치 작업을 요청한 프로세스는 Device Queue에서 입출력 완료를 기다린다.
| 큐 유형 | 용도 | 관리 주체 |
|---|---|---|
| Job Queue | 시스템 내 모든 프로세스 | 장기 스케줄러 |
| Ready Queue | CPU 할당 대기 프로세스 | 단기 스케줄러 |
| Device Queue | 특정 장치 대기 프로세스 | I/O 스케줄러 |
프로세스가 생성된 뒤 실행되기까지 Ready Queue를 거치며, 입출력이 필요한 경우에는 장치별 Wait Queue로 이동한다. 이 큐는 PCB를 연결 리스트 방식으로 연결해 관리한다.
생성 이후 종료까지의 자원 처리
프로세스는 다른 프로세스에 의해 생성되고 부모-자식 관계를 형성한다. 생성 과정에서는 PID를 부여하고, 커널 메모리에 PCB를 할당해 초기화한다. 이어 프로세스 주소 공간과 필요한 시스템 자원을 할당하고, 프로그램 카운터와 스택 포인터를 설정한 뒤 Ready Queue에 등록한다.
UNIX/Linux에서는 다음 시스템 콜이 이 흐름과 관련된다.
| 시스템 콜 | 기능 | 특징 |
|---|---|---|
| fork() | 현재 프로세스 복제 | 부모와 동일한 자식 생성 |
| exec() | 새 프로그램으로 교체 | 메모리 이미지 교체 |
| clone() | 스레드/프로세스 생성 | 공유 범위 지정 가능 |
| vfork() | 최적화된 fork | exec 전용, COW 불필요 |
프로세스의 종료는 exit() 호출에 의한 정상 종료, 치명적 오류에 따른 오류 종료, kill 시그널을 통한 강제 종료, 부모 종료에 따른 연쇄 종료로 나뉜다.
| 종료 유형 | 원인 | 설명 |
|---|---|---|
| 정상 종료 | exit() 호출 | 프로세스가 자발적으로 종료 |
| 오류 종료 | 치명적 오류 | 예외, 세그멘테이션 폴트 |
| 강제 종료 | kill 시그널 | 다른 프로세스에 의한 종료 |
| 연쇄 종료 | 부모 종료 | 부모 종료 시 자식도 종료 |
종료 처리에서는 열린 파일과 자원을 해제하고, 할당된 메모리를 반환한다. 자식 프로세스를 처리해 고아 프로세스를 방지하고, 부모에게 종료 상태를 전달한 뒤 PCB를 해제한다.
| 유형 | 정의 | 해결 방법 |
|---|---|---|
| 좀비(Zombie) | 종료되었으나 PCB가 남아있는 프로세스 | 부모가 wait() 호출 |
| 고아(Orphan) | 부모가 먼저 종료된 자식 프로세스 | init 프로세스가 입양 |
주소 공간을 넘는 통신 수단
프로세스는 각자 독립된 주소 공간을 가지므로, 서로 데이터를 주고받으려면 IPC 메커니즘이 필요하다. 통신 대상의 관계, 데이터 성격, 동기화 요구에 따라 수단을 선택한다.
| 기법 | 특징 | 용도 |
|---|---|---|
| 파이프(Pipe) | 단방향, 부모-자식 간 | 명령어 연결 |
| 명명된 파이프 | 양방향, 비관련 프로세스 | 서버-클라이언트 |
| 메시지 큐 | 비동기, 메시지 단위 | 분산 시스템 |
| 공유 메모리 | 고속, 동기화 필요 | 대용량 데이터 |
| 소켓 | 네트워크 통신 | 네트워크 서비스 |
| 시그널 | 비동기 이벤트 알림 | 예외 처리 |