PCB와 컨텍스트 스위칭: 운영체제가 프로세스 상태를 보존하는 방식

PCB의 구성 정보와 생명주기, 컨텍스트 스위칭 과정, 스레드 TCB 및 Linux·Windows 구현을 실무 관점에서 정리한다.

2026-08-14 · 최초 발행 2026-01-02

프로세스는 PCB를 통해 커널에 자신의 상태를 남긴다

PCB(Process Control Block)는 운영체제가 프로세스의 상태와 자원을 관리하기 위해 보유하는 핵심 자료구조다. Process Control Block 또는 Task Control Block(TCB)이라고도 하며, 프로세스마다 하나의 PCB가 할당된다.

여기에는 프로세스 식별자, CPU 레지스터 값, 메모리 관리 정보, 입출력 상태, 스케줄링 정보가 담긴다. PCB는 커널 메모리에 존재하므로 사용자 프로세스가 직접 접근할 수 없고, 운영체제만 이를 읽고 수정한다. 프로세스가 만들어질 때 할당되고 실행 중 갱신되며, 종료 시 해제된다.

사용자 공간운영체제 커널관리관리관리PCB프로세스 1PCB프로세스 2PCB프로세스 3스케줄러프로세스 1프로세스 2프로세스 3

멀티태스킹 환경에서 PCB는 각 프로세스의 독립된 실행 환경을 유지하면서 CPU 시간을 공유하게 한다. 현재 실행 중인 프로세스의 상태를 보관했다가 다시 선택됐을 때 복구할 수 있으므로 실행 연속성도 확보된다. 상태 추적, 스케줄링 판단, 자원 할당과 회수, 프로세스 간 통신 지원 역시 PCB를 기반으로 이뤄진다.

식별자부터 잠금 정보까지 PCB에 담기는 상태

프로세스 식별 정보에는 시스템 전체에서 유일한 정수인 PID와, 이를 생성한 부모 프로세스의 PID인 PPID가 포함된다. PGID는 관련 프로세스 집합을 식별해 신호 전달과 작업 제어에 쓰인다. UID와 GID는 프로세스 소유자와 권한, 접근 제어의 기준이 된다.

CPU 상태에서는 다음에 실행할 명령어 주소를 가리키는 프로그램 카운터(PC)가 특히 중요하다. 이와 함께 범용 레지스터(R0, R1, ..., Rn), 스택 포인터(SP), 베이스 포인터(BP), 상태 레지스터(플래그)가 저장된다. PCB는 프로세스 우선순위, 스케줄링 큐 포인터, CPU 사용 시간, 마지막 실행 시간도 보관한다.

메모리 영역에서는 코드·데이터·스택·힙 세그먼트의 주소와 크기, 가상 메모리 매핑을 위한 페이지 테이블 포인터, 최대 메모리 사용량과 스택·힙 크기 제한을 관리한다. 페이지 테이블의 메모리 주소는 MMU(Memory Management Unit)가 사용한다.

파일과 입출력 관련 상태도 빠지지 않는다. 열린 파일 테이블에는 파일 디스크립터 목록, 파일 위치 포인터, 읽기·쓰기 같은 접근 모드가 남는다. 대기 중인 입출력 요청, 할당된 장치, 입출력 버퍼, 상대 경로 해석 기준인 현재 작업 디렉터리도 프로세스 상태의 일부다.

프로세스는 생성 중인 New, 실행 준비가 된 Ready, 실행 중인 Running, 입출력을 기다리는 Waiting/Blocked, 종료된 Terminated 상태를 오간다. 우선순위는 사용자가 지정하는 정적 우선순위와 스케줄러가 조정하는 동적 우선순위로 나뉘며, Unix/Linux에서는 Nice 값으로도 우선순위를 조정한다.

스케줄링시간 만료I/O 요청I/O 완료New(생성)Ready(준비)Running(실행)Waiting(대기)Terminated(종료)

PCB에는 부모 프로세스 포인터, 자식 프로세스 리스트, 형제 프로세스 포인터 같은 관계 정보도 있다. CPU 사용 시간(user time, system time), 메모리 사용량, 생성 시간, 종료 시간은 프로세스 계정 정보로 관리한다. 대기 신호, 신호 핸들러 주소, 블록된 신호 마스크와 세마포어·뮤텍스, 대기 자원, 소유 락도 PCB가 다루는 정보다.

CPU를 넘길 때 PCB에 저장하고 다시 복원하는 상태

컨텍스트 스위칭은 실행 중이던 프로세스의 CPU 상태를 PCB에 기록하고 다른 프로세스의 상태를 가져오는 작업이다. 먼저 현재 프로세스의 레지스터 값, 프로그램 카운터, 스택 포인터, 상태 레지스터를 저장한다.

그다음 스케줄러가 Ready 큐에서 다음 프로세스를 고른다. 이때 FCFS, SJF, RR 등의 스케줄링 알고리즘을 적용하고 선택된 프로세스의 PCB를 찾는다. 새 PCB에서 레지스터와 프로그램 카운터를 복원하고, 페이지 테이블 변경으로 메모리 매핑을 전환한 뒤 프로세스 상태를 Running으로 바꾼다. 복원된 프로그램 카운터의 주소로 이동하면 해당 프로세스는 이전 지점에서 실행을 계속한다.

"프로세스 B""PCB B""PCB A""운영체제""프로세스 A""프로세스 B""PCB B""PCB A""운영체제""프로세스 A""PC, SP, 범용 레지스터 저장""PC, SP, 범용 레지스터 복원""시간 할당량 소진 또는 I/O 요청""현재 레지스터 값 저장""스케줄러 실행""레지스터 값 복원""실행 재개""계속 실행"

이 전환에는 비용이 따른다. 레지스터 저장과 복원에는 수십~수백 클럭 사이클이 들고, 캐시 무효화는 캐시 미스를 늘리며, TLB 플러시는 주소 변환 지연을 만든다. 총 오버헤드는 마이크로초 단위다.

스위칭이 지나치게 잦으면 오버헤드가 커져 처리량이 낮아지고, 반대로 너무 적으면 응답성이 떨어진다. 타임 슬라이스는 10-100ms 범위에서 최적화할 수 있다. 경량 프로세스(LWP)나 스레드를 사용하면 주소 공간을 공유해 전환 비용을 줄일 수 있으며, 캐시 친화적 스케줄링과 프로세서 친화도(CPU Affinity) 설정도 관련된 최적화 수단이다.

생성·스케줄링·종료에서 달라지는 PCB 상태

fork() 시스템 콜은 부모 프로세스의 PCB를 복사하고 새 PID를 할당한다. 부모의 메모리 공간은 Copy-on-Write 방식으로 복사하며, 열린 파일 디스크립터도 복사한 뒤 새 PCB를 Ready 큐에 넣는다.

exec() 시스템 콜은 현재 PCB를 유지한 상태에서 메모리 주소 공간을 교체한다. 새 프로그램 코드를 적재하고 PC를 새 프로그램의 시작 주소로 설정한다.

Ready 큐는 PCB를 연결 리스트로 관리하거나 우선순위별 다중 큐로 나눌 수 있다. 스케줄러는 PCB의 우선순위 정보를 참조해 FCFS(First-Come, First-Served), SJF(Shortest Job First), RR(Round Robin), Priority Scheduling 같은 방식을 적용한다.

Ready Queue대기대기PCB 1(우선순위: 10)PCB 2(우선순위: 20)PCB 3(우선순위: 15)스케줄러CPU스케줄링 기준:우선순위, 실행 시간,도착 시간

exit() 시스템 콜이 호출되면 프로세스 상태는 Terminated로 바뀐다. 열린 파일 디스크립터를 닫고 할당된 메모리를 해제한 뒤 부모 프로세스에 SIGCHLD 신호를 보낸다. 종료 상태 코드는 wait()을 위해 저장되며, PCB는 부모가 wait()을 호출하기 전까지 좀비 상태로 유지된다. 부모가 wait()을 호출하면 PCB는 완전히 해제된다.

좀비(Zombie) 프로세스는 종료됐지만 PCB가 남아 있는 상태다. 고아(Orphan) 프로세스는 부모가 먼저 종료된 자식 프로세스를 뜻하며, init 프로세스(PID 1)가 그 부모가 된다.

프로세스 PCB와 스레드 TCB가 나누는 정보

멀티스레드 환경에서 스레드별로 관리해야 할 정보는 스레드 ID, 스레드 상태, 레지스터 값, 스택 포인터다. 반면 코드 세그먼트, 데이터 세그먼트, 힙 메모리, 열린 파일 디스크립터는 같은 프로세스의 스레드가 공유한다.

TCB(Thread Control Block)는 스레드별 PCB의 경량 버전으로, 프로세스 PCB와 연결돼 스레드 스케줄링 정보를 관리한다.

공유 자원스레드공유공유공유PCB(프로세스)TCB 1TCB 2TCB 3코드세그먼트데이터세그먼트파일디스크립터

Linux와 Windows에서 프로세스 정보를 보관하는 구조

Linux에서는 struct task_struct가 PCB 역할을 한다. 약 200개 이상의 필드를 가지며 슬랩 할당자(Slab Allocator)로 관리된다. 주요 필드로는 프로세스 ID인 pid_t pid, 프로세스 상태를 담는 unsigned int state, 메모리 관리 구조체를 가리키는 struct mm_struct *mm, 파일 디스크립터 테이블을 가리키는 struct files_struct *files, 우선순위인 int prio가 있다.

Windows에서는 EPROCESS 구조체가 프로세스 정보를 담당한다. 이 구조체는 커널 모드에서만 접근할 수 있고 확장 가능한 구조를 가진다. Process ID, 프로세스 핸들 테이블, 가상 주소 디스크립터, 스레드 리스트, 프로세스 토큰(보안 정보)이 주요 필드다.

PCB를 보면 프로세스 관리가 단순히 실행할 프로그램을 고르는 일이 아니라는 점이 드러난다. 생성부터 실행, 스케줄링, 종료까지의 상태와 자원을 일관되게 보존하는 기반이며, 컨텍스트 스위칭과 동기화 같은 운영체제 동작을 이해하는 출발점이 된다.

운영체제PCB프로세스 관리컨텍스트 스위칭스케줄링