PCB
PCB
- PCB(Process Control Block): 운영체제가 프로세스를 관리하기 위해 사용하는 커널 내부 자료구조
- 프로그램은 디스크에 저장된 실행 파일이고, 프로세스는 메모리에 올라와 실행 중인 프로그램이다.
- 프로세스가 실행되려면 CPU, 메모리, 파일, 입출력 장치 같은 자원이 필요하다.
- 운영체제는 여러 프로세스가 동시에 실행되는 것처럼 보이도록 CPU 시간을 나눠서 할당한다.
- 이때 각 프로세스가 어떤 상태인지, 어디까지 실행되었는지, 어떤 자원을 사용 중인지 저장해두어야 한다.
- PCB 는 이러한 프로세스의 실행 정보를 저장하는 자료구조이다.
Process
프로세스(Process)는 실행 중인 프로그램이다.
예를 들어 사용자가 어떤 프로그램을 실행하면, 운영체제는 해당 실행 파일을 메모리에 적재하고 프로세스를 생성한다.
프로세스는 단순히 코드만 가지고 실행되는 것이 아니라 다음과 같은 요소들을 함께 가진다.
- Code 영역
- Data 영역
- Heap 영역
- Stack 영역
- CPU Register 값
- Program Counter
- 열린 파일 정보
- 메모리 관리 정보
- 스케줄링 정보
즉, 프로세스는 실행 파일의 코드와 실행 중인 상태 정보가 합쳐진 실행 단위라고 볼 수 있다.
PCB 의 역할
PCB 는 운영체제가 프로세스를 식별하고 제어하기 위해 사용하는 정보 저장 공간이다.
운영체제는 여러 프로세스를 동시에 관리해야 한다.
하지만 CPU 는 한 순간에 하나의 실행 흐름만 처리할 수 있다.
그래서 운영체제는 CPU 를 여러 프로세스에게 번갈아 할당하면서 마치 여러 프로그램이 동시에 실행되는 것처럼 만든다.
이때 어떤 프로세스가 CPU 를 사용하다가 중단되면, 나중에 다시 이어서 실행할 수 있어야 한다.
이를 위해 운영체제는 현재 프로세스의 실행 상태를 PCB 에 저장한다.
그리고 나중에 해당 프로세스가 다시 CPU 를 할당받으면 PCB 에 저장된 정보를 복원해서 이전 실행 흐름을 이어간다.
즉, PCB 는 프로세스의 실행 상태를 저장하고 복원하기 위한 핵심 자료구조이다.
PCB 에 저장되는 정보
PCB 에는 일반적으로 다음과 같은 정보들이 저장된다.
- Process ID
- Process State
- Program Counter
- CPU Register 정보
- CPU Scheduling 정보
- Memory Management 정보
- Accounting 정보
- I/O Status 정보
운영체제마다 PCB 의 내부 구현은 다를 수 있지만, 기본적으로 프로세스를 중단했다가 다시 실행하기 위해 필요한 정보들이 저장된다.
Process ID
Process ID 는 프로세스를 식별하기 위한 고유한 값이다.
운영체제는 여러 프로세스를 동시에 관리하기 때문에 각각의 프로세스를 구분할 수 있어야 한다.
이때 사용되는 값이 PID 이다.
예를 들어 Linux 에서 ps 명령어를 사용하면 각 프로세스의 PID 를 확인할 수 있다.
ps
프로세스가 생성되면 운영체제는 해당 프로세스에 PID 를 할당한다.
그리고 이후 프로세스 관리, 종료, 추적, 권한 검사 등의 과정에서 PID 를 사용한다.
예를 들어 특정 프로세스를 종료할 때도 PID 를 기준으로 프로세스를 지정한다.
kill 1234
위 명령어는 PID 가 1234 인 프로세스에 종료 신호를 보내는 것과 비슷한 의미이다.
Process State
Process State 는 현재 프로세스가 어떤 상태에 있는지 나타내는 정보이다.
프로세스는 실행되는 동안 여러 상태를 오가게 된다.
대표적인 프로세스 상태는 다음과 같다.
- New
- Ready
- Running
- Waiting
- Terminated
New
New 상태는 프로세스가 생성되는 중인 상태이다.
사용자가 프로그램을 실행하거나, 어떤 프로세스가 새로운 프로세스를 생성하면 운영체제는 새로운 PCB 를 만들고 프로세스 실행에 필요한 자원을 준비한다.
이 과정이 끝나면 프로세스는 Ready 상태로 이동할 수 있다.
Ready
Ready 상태는 CPU 를 할당받을 준비가 된 상태이다.
프로세스는 실행에 필요한 기본 준비가 끝났지만, 아직 CPU 를 할당받지 못한 상태이다.
Ready 상태의 프로세스들은 보통 Ready Queue 에 들어가고, 스케줄러가 이 중 하나를 선택해서 CPU 를 할당한다.
Running
Running 상태는 프로세스가 실제로 CPU 를 사용 중인 상태이다.
프로세스가 CPU 를 할당받으면 Running 상태가 되고, 자신의 명령어를 실행한다.
하지만 계속 CPU 를 점유할 수는 없다.
타임 슬라이스가 끝나거나, 더 높은 우선순위의 프로세스가 등장하거나, 입출력 작업이 필요해지면 Running 상태에서 다른 상태로 이동할 수 있다.
Waiting
Waiting 상태는 프로세스가 어떤 이벤트를 기다리는 상태이다.
예를 들어 파일 읽기, 네트워크 응답, 사용자 입력, 디스크 I/O 같은 작업을 기다릴 때 프로세스는 Waiting 상태가 된다.
Waiting 상태의 프로세스는 CPU 를 할당받아도 당장 실행할 수 없기 때문에, 해당 이벤트가 완료될 때까지 대기한다.
이벤트가 완료되면 다시 Ready 상태로 이동한다.
Terminated
Terminated 상태는 프로세스 실행이 끝난 상태이다.
프로세스가 정상적으로 종료되거나 오류로 종료되면 운영체제는 해당 프로세스의 자원을 정리한다.
이때 PCB 도 더 이상 필요하지 않게 되면 제거된다.
Program Counter
Program Counter 는 다음에 실행할 명령어의 주소를 저장하는 레지스터이다.
프로세스가 CPU 를 사용하다가 중단되면, 나중에 다시 실행할 때 어디서부터 이어서 실행해야 하는지 알아야 한다.
이를 위해 현재 Program Counter 값이 PCB 에 저장된다.
예를 들어 프로세스가 다음과 같은 흐름으로 실행되고 있었다고 하면
mov eax, 1
add eax, 2
mov ebx, eax
프로세스가 add eax, 2 까지 실행한 뒤 중단되었다면, 나중에 다시 실행될 때 mov ebx, eax 부터 이어서 실행되어야 한다.
이 위치를 알기 위해 Program Counter 값이 필요하다.
즉, Program Counter 는 프로세스의 실행 위치를 복원하기 위한 정보이다.
CPU Register 정보
프로세스가 실행되는 동안 CPU Register 에는 여러 값이 저장된다.
예를 들어 x86 기준으로 다음과 같은 레지스터들이 사용될 수 있다.
eax
ebx
ecx
edx
esp
ebp
eip
eflags
x86-64 기준으로는 다음과 같은 레지스터들이 사용된다.
rax
rbx
rcx
rdx
rsp
rbp
rip
rflags
프로세스가 CPU 를 사용하다가 중단되면, 레지스터 값도 함께 저장해야 한다.
만약 레지스터 값을 저장하지 않으면 나중에 프로세스를 다시 실행할 때 이전 계산 결과나 스택 위치를 복원할 수 없다.
예를 들어 어떤 프로세스가 rax 에 계산 결과를 저장한 상태에서 중단되었다면, 다시 실행할 때도 rax 값이 그대로 복원되어야 한다.
그래서 운영체제는 Context Switch 과정에서 현재 CPU Register 값을 PCB 에 저장하고, 다음에 실행할 프로세스의 PCB 에서 Register 값을 복원한다.
CPU Scheduling 정보
CPU Scheduling 정보는 운영체제가 어떤 프로세스에게 CPU 를 할당할지 결정하기 위해 사용하는 정보이다.
PCB 에는 다음과 같은 스케줄링 관련 정보가 저장될 수 있다.
- 프로세스 우선순위
- 스케줄링 큐 포인터
- CPU 사용 시간
- 타임 슬라이스 정보
- 스케줄링 정책 관련 값
운영체제의 스케줄러는 이러한 정보를 바탕으로 다음에 실행할 프로세스를 선택한다.
예를 들어 우선순위 기반 스케줄링에서는 우선순위가 높은 프로세스가 먼저 실행될 수 있다.
Round Robin 방식에서는 각 프로세스가 정해진 시간만큼 CPU 를 사용하고, 시간이 끝나면 다시 Ready Queue 로 들어간다.
이런 스케줄링 동작을 위해 PCB 에는 프로세스의 스케줄링 상태가 저장된다.
Memory Management 정보
Memory Management 정보는 프로세스의 메모리 주소 공간을 관리하기 위한 정보이다.
프로세스마다 독립적인 가상 주소 공간을 가진다.
운영체제는 각 프로세스의 가상 주소가 실제 물리 메모리의 어디에 매핑되는지 관리해야 한다.
이를 위해 PCB 에는 다음과 같은 정보가 저장될 수 있다.
- Page Table 정보
- Segment Table 정보
- Base Register
- Limit Register
- 주소 공간 관련 정보
현대 운영체제에서는 보통 가상 메모리를 사용한다.
프로세스는 자신만의 독립적인 메모리 공간을 사용하는 것처럼 보이지만, 실제로는 운영체제가 페이지 테이블을 통해 가상 주소를 물리 주소로 변환한다.
프로세스가 전환될 때는 메모리 주소 공간도 함께 전환되어야 한다.
그래서 PCB 에는 해당 프로세스의 메모리 관리 정보를 찾을 수 있는 정보가 포함된다.
Accounting 정보
Accounting 정보는 프로세스의 자원 사용량과 관련된 정보이다.
운영체제는 프로세스가 CPU 를 얼마나 사용했는지, 어떤 사용자가 실행했는지, 얼마나 많은 시간을 사용했는지 등을 기록할 수 있다.
PCB 에 저장될 수 있는 Accounting 정보는 다음과 같다.
- CPU 사용 시간
- 실제 실행 시간
- 프로세스 생성 시간
- 사용자 ID
- 그룹 ID
- 자원 사용량
이 정보는 시스템 모니터링, 권한 관리, 자원 제한, 과금 시스템 등에서 사용될 수 있다.
예를 들어 서버 환경에서는 특정 사용자가 CPU 시간을 과도하게 사용하는지 확인해야 할 수 있다.
이때 프로세스별 자원 사용량 정보가 필요하다.
I/O Status 정보
I/O Status 정보는 프로세스가 사용 중인 입출력 자원과 관련된 정보이다.
프로세스는 실행 중에 파일, 소켓, 디바이스 같은 자원을 사용할 수 있다.
운영체제는 각 프로세스가 어떤 파일을 열었는지, 어떤 장치를 사용 중인지 관리해야 한다.
PCB 에 저장될 수 있는 I/O 관련 정보는 다음과 같다.
- 열린 파일 목록
- 파일 디스크립터 테이블
- 사용 중인 입출력 장치 정보
- 대기 중인 I/O 요청 정보
예를 들어 프로세스가 파일을 열면 운영체제는 해당 프로세스의 파일 디스크립터 테이블에 파일 정보를 등록한다.
int fd = open("test.txt", O_RDONLY);
이후 프로세스는 fd 값을 이용해서 파일에 접근한다.
read(fd, buf, 100);
운영체제는 이 fd 가 실제로 어떤 파일을 가리키는지 알고 있어야 한다.
이런 정보들이 프로세스의 I/O 상태 정보로 관리된다.
Context
Context 는 프로세스의 실행 상태를 의미한다.
프로세스가 어떤 시점에 실행되고 있었다면, 그 시점의 CPU Register 값, Program Counter, Stack Pointer, 메모리 정보 등이 프로세스의 Context 라고 볼 수 있다.
운영체제가 프로세스를 중단했다가 나중에 다시 실행하려면 이 Context 를 저장하고 복원해야 한다.
이때 Context 를 저장하는 곳이 PCB 이다.
즉, PCB 는 프로세스의 Context 를 저장하는 공간이라고 볼 수 있다.
Context Switch
Context Switch 는 CPU 가 실행 중인 프로세스를 다른 프로세스로 전환하는 과정이다.
예를 들어 Process A 가 CPU 를 사용하다가 Process B 로 전환된다고 하면, 운영체제는 다음과 같은 작업을 수행한다.
- Process A 의 현재 실행 상태를 저장한다.
- Process A 의 Register, Program Counter, Stack Pointer 등을 PCB 에 저장한다.
- 스케줄러가 다음에 실행할 Process B 를 선택한다.
- Process B 의 PCB 에 저장된 실행 상태를 복원한다.
- CPU 실행 흐름이 Process B 로 이동한다.
즉, Context Switch 는 현재 프로세스의 상태를 PCB 에 저장하고, 다음 프로세스의 상태를 PCB 에서 복원하는 과정이다.
Context Switch 예시
예를 들어 두 개의 프로세스가 있다고 하면
Process A
Process B
처음에는 Process A 가 CPU 를 사용 중이라고 하자.
CPU -> Process A
그러다가 타이머 인터럽트가 발생하면 운영체제가 개입한다.
운영체제는 Process A 의 현재 상태를 Process A 의 PCB 에 저장한다.
Process A PCB
- Program Counter
- Register
- Stack Pointer
- Process State
그 후 스케줄러가 Process B 를 선택하면, 운영체제는 Process B 의 PCB 에 저장된 값을 CPU 에 복원한다.
Process B PCB
- Program Counter
- Register
- Stack Pointer
- Process State
그러면 CPU 는 Process B 의 실행 흐름을 이어서 실행한다.
CPU -> Process B
이런 방식으로 운영체제는 여러 프로세스가 동시에 실행되는 것처럼 보이게 만든다.
PCB 와 Kernel
PCB 는 일반적으로 커널 영역에 저장된다.
프로세스가 자신의 PCB 를 직접 수정할 수 있다면 시스템 전체가 불안정해질 수 있다.
예를 들어 프로세스가 자신의 우선순위를 마음대로 높이거나, 다른 프로세스의 메모리 정보를 변경할 수 있다면 운영체제의 보안과 안정성이 깨지게 된다.
그래서 PCB 는 운영체제가 관리하는 커널 메모리 영역에 존재하고, 일반 사용자 프로세스가 직접 접근할 수 없다.
프로세스는 시스템 콜을 통해 운영체제에게 요청하고, 운영체제가 필요한 경우 PCB 나 커널 내부 자료구조를 수정한다.
예를 들어 프로세스를 종료할 때 사용자 프로그램이 직접 PCB 를 삭제하는 것이 아니라, 운영체제에게 종료 요청을 보내고 운영체제가 자원을 정리한다.
PCB 와 Process Table
운영체제는 여러 프로세스의 PCB 를 관리해야 한다.
이를 위해 PCB 들을 모아둔 자료구조를 Process Table 이라고 부를 수 있다.
Process Table 에는 현재 시스템에 존재하는 프로세스들의 정보가 저장된다.
프로세스가 생성되면 새로운 PCB 가 만들어지고 Process Table 에 등록된다.
프로세스가 종료되면 해당 PCB 가 Process Table 에서 제거된다.
운영체제는 Process Table 을 통해 특정 PID 를 가진 프로세스를 찾거나, 스케줄링 가능한 프로세스를 탐색하거나, 프로세스 상태를 관리한다.
Zombie Process
Zombie Process 는 실행은 종료되었지만, 부모 프로세스가 종료 상태를 회수하지 않아서 PCB 일부가 남아 있는 프로세스이다.
프로세스 자체의 실행은 끝났기 때문에 CPU 를 사용하지 않는다.
하지만 프로세스 종료 상태와 PID 같은 정보가 남아 있어 Process Table 의 항목을 차지할 수 있다.
예를 들어 Linux 에서 자식 프로세스가 종료되었는데 부모 프로세스가 wait() 를 호출하지 않으면 자식 프로세스가 Zombie 상태로 남을 수 있다.
wait(NULL);
wait() 는 부모 프로세스가 자식 프로세스의 종료 상태를 회수할 때 사용된다.
부모가 종료 상태를 회수하면 운영체제는 남아 있던 PCB 정보를 정리할 수 있다.
PCB 와 TCB
PCB 와 비슷한 개념으로 TCB(Thread Control Block)가 있다.
PCB 는 프로세스를 관리하기 위한 자료구조이고, TCB 는 스레드를 관리하기 위한 자료구조이다.
프로세스는 하나 이상의 스레드를 가질 수 있다.
각 스레드는 독립적인 실행 흐름을 가지기 때문에, 스레드마다 Program Counter, Register, Stack 같은 실행 상태를 따로 저장해야 한다.
이때 사용되는 자료구조가 TCB 이다.
- PCB: 프로세스 단위의 자원과 상태를 관리
- TCB: 스레드 단위의 실행 흐름과 상태를 관리
프로세스는 주소 공간, 파일 디스크립터, 메모리 정보 같은 자원을 가지고, 스레드는 같은 프로세스 내부에서 실행 흐름을 나눠 가진다.
그래서 멀티스레드 환경에서는 하나의 PCB 와 여러 개의 TCB 가 함께 사용될 수 있다.
정리
PCB 는 운영체제가 프로세스를 관리하기 위해 사용하는 커널 내부 자료구조이다.
프로세스가 실행되려면 CPU, 메모리, 파일, 입출력 장치 같은 여러 자원이 필요하고, 운영체제는 이 정보를 관리해야 한다.
PCB 에는 일반적으로 다음과 같은 정보들이 저장된다.
- Process ID
- Process State
- Program Counter
- CPU Register 정보
- CPU Scheduling 정보
- Memory Management 정보
- Accounting 정보
- I/O Status 정보