PCB (Process Control Block)
PCB란
PCB(Process Control Block)는 운영체제가 프로세스를 관리하기 위해 유지하는 자료구조다. 일반적으로 각 프로세스마다 하나의 PCB가 생성되며, 운영체제는 PCB를 통해 프로세스의 모든 정보를 추적하고 관리한다. 현대 운영체제에서는 스레드 단위로 관리하는 TCB(Thread Control Block)와 함께 사용되기도 한다.
프로세스가 생성되면 운영체제는 해당 프로세스의 PCB를 만들고, 프로세스가 종료되면 PCB를 제거한다. PCB는 커널 메모리 영역에 저장되며, 사용자 프로그램은 직접 접근할 수 없다.
PCB의 역할
운영체제는 PCB를 사용하여 다음과 같은 작업을 수행한다:
- 프로세스 식별: 각 프로세스를 고유하게 구분한다
- 프로세스 상태 추적: 프로세스가 현재 어떤 상태인지 파악한다
- Context Switching: CPU를 다른 프로세스에게 전환할 때 현재 상태를 저장하고 복원한다
- 스케줄링: CPU를 어떤 프로세스에게 할당할지 결정한다
- 자원 관리: 프로세스가 사용 중인 메모리, 파일, 장치 등을 추적한다
PCB의 구성 요소
PCB는 다음과 같은 정보를 포함한다:
1. Process ID (PID)
프로세스를 고유하게 식별하는 번호다. 운영체제는 PID를 통해 각 프로세스를 구분하고, 사용자도 이 번호를 사용하여 특정 프로세스를 제어할 수 있다. 예를 들어 Linux의 kill 1234 명령은 PID 1234번 프로세스를 종료한다.
2. Process State
프로세스의 현재 상태를 나타낸다. New, Ready, Running, Waiting, Terminated 중 하나의 값을 가지며, 스케줄러는 이 정보를 바탕으로 프로세스를 적절한 큐에 배치한다.
3. Program Counter (PC)
프로세스가 다음에 실행할 명령어의 주소를 저장한다. Context Switching이 발생하면 현재 PC 값을 PCB에 저장하고, 다시 이 프로세스가 실행될 때 저장된 PC 값을 복원하여 중단된 지점부터 계속 실행할 수 있다.
4. CPU Registers
CPU의 모든 레지스터 값을 저장한다. 누산기(Accumulator), 인덱스 레지스터, 스택 포인터 등 프로세스 실행에 필요한 모든 레지스터 정보가 포함된다. Context Switching 시 이 값들을 저장하고 복원함으로써 프로세스가 정확히 중단된 상태에서 재개할 수 있다.
5. Scheduling Information
CPU 스케줄링에 필요한 정보다. 프로세스의 우선순위(Priority), 스케줄링 큐 포인터, 스케줄링 파라미터 등이 포함된다. 스케줄러는 이 정보를 참고하여 어떤 프로세스에게 CPU를 할당할지 결정한다.
6. Memory Management Information
프로세스가 사용하는 메모리 정보다. 페이지 테이블, 세그먼트 테이블, 베이스 레지스터, 리미트 레지스터 등 메모리 관리에 필요한 정보가 포함된다. 운영체제는 이 정보를 통해 프로세스의 메모리 접근을 제어한다.
7. Accounting Information
프로세스의 자원 사용 통계다. CPU 사용 시간, 실제 실행 시간, 시간 제한, 계정 번호 등이 포함된다. 이 정보는 시스템 모니터링, 과금, 성능 분석에 활용된다.
8. I/O Status Information
프로세스가 사용 중인 I/O 자원 정보다. 프로세스에 할당된 I/O 장치, 열린 파일, 파일 디스크립터 등을 가리키는 포인터 또는 참조 정보를 포함한다. 실제 파일 테이블이나 디바이스 테이블은 커널의 별도 공간에 존재하며, PCB는 이를 간접적으로 참조한다.
PCB의 위치
PCB는 운영체제 커널의 메모리 공간에 저장된다. 일반적으로 PCB들은 연결 리스트나 배열 형태로 관리되며, 운영체제는 상태별로 PCB 큐를 유지한다:
- Job Queue: 보조 저장장치에서 메모리로 로드되기를 기다리는 프로세스들의 PCB (주로 New 상태)
- Ready Queue: 메모리에 적재되어 CPU 할당을 기다리는 Ready 상태 프로세스들의 PCB
- Wait Queue: I/O 작업이나 이벤트 완료를 대기 중인 프로세스들의 PCB
스케줄러는 이러한 큐를 탐색하여 다음에 실행할 프로세스를 선택한다.