프로세스 제어 블록(PCB, Process Control Block) 이란?
- 운영체제가 각 프로세스에 대한 중요한 정보를 저장하는 데이터 구조
- PCB는 프로세스의 실행 상태를 관리하고 프로세스 간의 문맥 전환(Context Switching)을 지원하는 데 필수적인 역할을 함
- 운영체제에서 관리하는 프로세스에 대한 메타데이터를 저장한 데이터블록이며
커널 스택에 저장
- 각 프로세스가 생성될 때마다 고유의 PCB가 생성되고 프로세스가 종료되면 PCB는 제거
커널 스택(Kernel Stack), 유저 스택(User Stack)이란?
- 가상 메모리에서 각각 운영체제의 커널모드와 사용자 모드에서 사용되는 스택을
커널 스택
과 유저 스택
이라 함
커널 스택
- 역할
- 시스템 호출, 인터럽트 처리 그리고 다른 커널 모드에서 실행되는 작업들이 사용하는 스택
- 보안 및 안정성
- 사용자 프로그램의 버그나 악의적인 공격으로부터 커널을 보호, 사용자 모드에서 커널 스택에 직접 접근할 수 없음
- 크기
- 일반적으로 고정된 크기를 가지며 이는 보통 8KB 정도, 이는 커널이 처리할 수 있는 최대 스택 프레임 깊이를 제한
- 프로세스당 커널 스택
- 각 프로세스는 자신만의 커널 스택을 가지며 프로세스가 커널 모드로 전환될 때 사용
프로세스가 사용자 모드로 돌아갈 때 커널 스택은 해당 프로세스의 상태를 유지
유저 스택
- 역할
- 애플리케이션 코드가 함수 호출, 지역 변수 저장 그리고 함수 인자 전달 등을 위해 사용하는 스택
- 크기
- 유저 스택은 유동적이며, 프로그램 실행 중에 스택 크기가 동적으로 변경될 수 있음
- 프로세스당 유저 스택
- 각 프로세스는 자신만의 유저 스택을 가지며, 이 스택은 프로세스의 주소 공간 내에 위치
- 일반적으로 스택 영역은 높은 주소에서 낮은 주소로 확장
- 상호 작용
- 유저 스택은 커널 스택과 직접 상호작용하지 않지만, 시스템 호출을 통해 커널 모드로 전환될 때 커널 스택과 간접적으로 상호작용할 수 있음
시스템 호출 시 유저 스택의 내용이 커널 스택으로 복사될 수 있음
PCB의 구조
- 프로세스 상태(Process State)
- 현재 프로세스가 어떤 상태에 있는지를 나타냄
- 상태 예 : 실행 중(Running), 준비 상태(Ready), 대기 상태(Waiting), 종료 상태(Terminated)
- 프로세스 번호(Process Number)
- 각 프로세스를 고유하게 식별하는 프로세스 ID(PID)
- 운영체제가 프로세스를 관리하고 추적하는 데 사용
- 프로그램 카운터(Program Counter)
- 프로세스가 다음에 실행할 명령어의 주소를 가리킴
- 프로세스가 중단된 위치에서 다시 시작할 수 있도록 함
- 레지스터(Registers)
- 프로세스가 실행 중에 사용하는 CPU 레지스터의 값들을 저장
- 문맥 전환(Context Switching) 시에 현재 프로세스의 레지스터 상태를 저장하고 새로운 프로세스의 레지스터 상태를 복원
- 메모리 제한(Memory Limits)
- 프로세스가 사용할 수 있는 메모리 범위를 정의
- 프로세스의 주소 공간, 페이지 테이블, 세그먼트 테이블 등의 정보가 포함
- 열린 파일 목록(List of Open Files)
- 프로세스가 현재 열고 있는 모든 파일에 대한 정보를 포함
- 파일 디스크립터 테이블(File Descriptor Table)을 통해 관리
프로세스 상태전이 다이어그램
- 생성 상태(New)
fork()
시스템 콜은 부모 프로세스가 새로운 자식 프로세스를 생성할 때 사용
- 새로운 프로세스는 먼저 생성 상태에 놓이게 됨
- 이때 운영체제는 새로운 프로세스에 대한 PCB를 생성
생성 상태
에서 준비 상태
로의 전이로 나타남
- 준비 상태(Ready)
- fork() 시스템 콜이 완료되면 새로운 프로세스는 준비 상태로 전이
- 이 상태에서 프로세스는 실행될 준비가 되어 있으며 CPU 할당을 기다림
- 준비 상태는 처음 프로세스가 생성된 이후 메모리 공간이 충분하면 메모리를 할당받고 그렇지 않으면 준비 큐(준비 순서열)에 들어가서 대기 중인 상태
- 이는 CPU 스케줄러부터 CPU 소유권이 넘어오기를 기다리는 상태
준비 상태
는 디스패처
에 의해 실행 상태
로 전이
- 실행 상태(Running)
- 디스패처(dispatcher)는 준비 상태의 프로세스 중 하나를 선택하여 실행 상태로 전환
- 실행 상태는 CPU 소유권과 메모리를 할당받고 인스트럭션을 수행 중인 상태를 의미
- exec() 시스템 콜은 현재 실행 중인 프로세스를 새로운 프로그램으로 대체하는 데 사용
- exec()가 호출되면 현재 프로세스의 코드, 데이터, 힙 및 스택 세그먼트가 새로운 프로그램으로 대체, 그러나 PID는 그대로 유지
실행 상태
는 타임아웃
또는 입출력 요청
에 의해 다른 상태로 전이될 수 있음
- 대기 상태(Waiting/Blocked)
- 대기 상태(Waiting/Blocked)
- 실행 중인 프로세스는 입출력 작업이나 다른 이벤트를 기다리기 위해 대기 상태로 전환될 수 있음
- 대기 상태에서는 CPU를 점유하지 않으며 이벤트가 발생할 때까지 기다림
- 예 : 프린트 인쇄 버튼을 눌렀을 때, 실행 중이던 프로세스가 IO 요청으로 인해 인터럽트가 발생하여 중단 상태로 변경
실행 상태
에서 대기 상태
로 전이되고 입출력 완료 시 대기 상태
에서 준비 상태
로 전이
- 대기 중단 상태(Ready Suspended)
- 준비 큐가 꽉 차거나 메모리 부족으로 인해 일시 중단된 상태
- 프로세스는 메모리가 충분해질 때까지 준비 큐 외부에서 대기
- 메모리 부족으로 인한 일시 중단 상태를 의미
- 일시 중단 상태(Blocked Suspended)
- 대기 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 인해 일시 중단된 상태
- 이는 중단된 상태에서 메모리가 부족하여 다시 대기할 수 없는 경우 발생
- 완료 상태(Terminated/Exit)
- 프로세스가 자신의 작업을 완료하면 종료 상태로 전환
- exit() 시스템 콜이 호출되면 프로세스는 종료되고 PCB는 운영체제에 의해 제거
- 종료 상태는 프로세스 실행이 완료되어 해당 프로세스에 대한 자원을 반납하며 PCB가 삭제되는 상태를 말함
- 종료는 자연스럽게 완료되는 경우도 있지만 부모 프로세스가 자식 프로세스를 강제로 종료시키는 비자발적 종료(abort)도 있음
- 자식 프로세스가 할당된 자원의 한계치를 넘어서거나 부모 프로세스가 종료될 때 또는 사용자가
process.kill
등의 명령어로 프로세스를 종료시킬 때 발생
실행 상태
에서 완료 상태
로 전이
컨텍스트 스위칭(Context Switching)
준비 상태에서 실행 상태로(디스패치)
- CPU 스케줄러가 준비 상태의 프로세스를 선택하여 실행 상태로 전환할 때 현재 실행 중인 프로세스의 상태를 PCB에 저장하고 선택된 프로세스의 상태를 복원
실행 상태에서 준비 상태로(타임아웃)
- 프로세스가 할당된 시간 동안 실행을 완료하지 못하고 타임아웃이 발생하면 현재 실행 중인 프로세스의 상태를 PCB에 저장하고 준비 상태로 전환
실행 상태에서 대기 상태로(입출력 요청)
- 실행 중인 프로세스가 입출력을 요청하면 현재 상태를 PCB에 저장하고 대기 상태로 전환
대기 상태에서 준비 상태로(입출력 완료)
- 대기 상태의 프로세스가 요청한 입출력이 완료되면 PCB에 저장된 상태를 복원하고 준비 상태로 전환
컨텍스트 스위칭의 비용 측면
- CPU 오버헤드
- 컨텍스트 스위칭은 현재 실행 중인 프로세스의 상태를 PCB에 저장하고 새로운 프로세스의 상태를 PCB에서 복원하는 작업이 필요함, 이 과정에서 CPU 오버헤드가 발생
- 캐시 미스(Cache Misses)
- 프로세스가 전환되면 CPU 캐시(예: L1,L2,L3 캐시)가 새로운 프로세스의 데이터로 교체되어야 함, 이로 인해 캐시 미스가 증가하고 메모리 접근 시간이 길어져 성능이 저하될 수 있음
- 메모리관리
- 각 프로세스는 자신만의 주소 공간을 가지므로 프로세스 전환 시 메모리 관리 데이터 구조(예: 페이지 테이블)를 변경해함, 이 또한 시간과 자원을 소모
- 유휴시간(Idle Time)
- 컨텍스트 스위칭이 빈번하게 발생하면 CPU가 유휴상태가 되는 시간이 늘어날 수 있음
- 특히, 프로세스가 I/O 작업을 대기하는 동안 CPU가 다른 작업을 수행하지 못하면 유휴 시간이 발생할 수 있음