프로세스 제어 블록(PCB, Process Control Block)
•
프로세스 제어 블록은 운영 체제에서 프로세스를 관리하기 위해 사용되는 데이터 구조로, 각 프로세스마다 PCB가 할당되어 해당 프로세스의 상태와 관련된 정보를 저장하고 관리한다.
•
PCB는 프로세스의 중요한 정보를 포함하고 있기 때문에, 일반 사용자가 접근하지 못하도록 보호된 메모리 영역에 저장된다. 일부 운영 체제에서는 PCB를 커널 스택의 처음에 위치시킨다.
•
포인터
프로세스 제어블록의 첫 블록에는 포인터가 저장된다. 여러 프로세스들 중 준비 상태나 대기 상태인 프로세스들은 큐를 통해서 관리되는데, PCB를 통해 준비 상태 큐나 대기 상태 큐를 구현할 때 포인터가 사용된다.
•
PID
운영 체제가 프로세스를 식별하기 위한 프로세스의 고유 식별번호로, 프로세스마다 고유의 PID를 가진다.
•
프로세스 상태
생성, 준비, 실행, 대기 등 프로세스의 현재 상태를 나타내며, 프로세스의 상태 변화에 따라 상태 정보를 업데이트한다.
•
실행 문맥(레지스터)
CPU를 점유하고 있는 프로세스는 운영 체제에 의해 계속 교체된다. 하나의 프로세스가 실행하다 교체된 이후 자신의 차례가 다시 돌아왔을 때, 이전의 동작을 이어서 실행하여 연속된 동작을 하는 것처럼 보이도록 레지스터의 정보를 저장한다.
•
프로세스 메모리 위치
프로세스가 사용하는 코드 영역, 데이터 영역 등의 메모리 영역에 대한 정보를 저장한다.
•
스케줄링 우선순위
여러 프로세스를 동시에 실행할 때 운영 체제는 프로세스 스케줄링을 통해 CPU를 공평하게 할당하는데, 이 스케줄링에서의 우선순위를 저장하고 있다.
•
권한
각 프로세스마다 특정 자원에 접근할 수 있는 권한들을 저장하고 있다.
•
부모와 자식 프로세스
최초의 init 프로세스를 제외하면 모든 프로세스는 부모 프로세스를 복제하여 자식 프로세스를 생성하면서 만들어진다. 이 때 프로세스의 계층 관계는 트리 구조를 가지고 있는데, 트리 구조에서의 부모 프로세스와 자식 프로세스에 대한 정보를 가지고 있다.
•
입출력 상태 정보
프로세스가 어떤 입출력 장치를 사용하는지, 현재 입출력 작업이 진행 중인지 등에 대한 정보를 저장한다.
포인터
•
입출력 작업이 완료되기를 기다리는 프로세스는 대기 상태를 가지는데, 이런 대기 상태의 프로세스들을 하나로 모아두면 인터럽트가 발생했을 때 이렇게 모아둔 프로세스들을 전부 뒤져봐야하기 때문에 관리가 불편하다. 그렇기 때문에 대기 상태의 프로세스들을 같은 입출력을 요구한 프로세스끼리 아래처럼 linked-list나 큐를 통해 모아놓는다.
프로세스 테이블
•
운영 체제는 빠르게 PCB에 접근하기 위해 프로세스 테이블을 사용하여 각 프로세스의 PCB를 관리한다.
•
운영 체제는 메모리 테이블, 입출력 테이블, 파일 테이블, 프로세스 테이블을 가진다.
실행 문맥(Context)
•
실행 문맥은 현재 상태를 나타내는 정보의 집합이다. Context에는 프로세스의 레지스터 상태, 프로그램 카운터(PC), 스택 포인터(SP) 등이 포함된다. Context는 프로세스가 중단되고 나중에 다시 실행되는 경우에 이전 상태를 복원하기 위해 사용된다. 예를 들면, 인터럽트로 인해 프로세스가 중단되면, Context를 저장하고 다시 해당 프로세스를 실행시킬 때 Context를 통해 복원한다.
프로그램 카운터(PC, Program Counter)
프로그램 카운터는 현재 실행 중인 명령어의 주소를 가리키는 레지스터다. 프로세스가 명령어를 실행하면 PC는 다음 명령어의 주소로 업데이트되면서 다음 명령어의 위치를 가리키고 있게 된다. 따라서, PC는 프로세스의 흐름을 제어하는데 사용된다.
Context Switching
•
Context switching은 운영 체제가 여러 프로세스를 동시에 실행하기 위해 프로세스 간의 전환을 수행하는 과정이다. 동작 중인(CPU를 점유하고 있던) 프로세스의 상태를 PCB에 보관하여 작업을 저장하고, 바꿀 프로세스의 PCB를 통해 이전 상태로 불러와 CPU를 세팅하고 동작 시키는 과정이다. 다시말해, 두 프로세스의 PCB를 교환하는 작업을 문맥 교환(Context Switching)이라 한다.
•
프로세스에 할당된 시간을 전부 사용하여 Timeout이 발생하거나, I/O 요청 System call과 같은 상황에서 컨텍스트 스위칭이 발생한다.
•
위 그림을 예시로 컨텍스트 스위칭의 절차를 살펴보면 다음과 같다.
1.
P0를 실행 중 interrupt나 system call이 발생하면 P0의 상태를 PCB0에 저장한다.
2.
PCB1에 저장된 P1의 상태를 불러와 복구한다.
3.
P1을 실행한다.
4.
P1 실행 중 interrupt나 system call이 발생하면 P1의 상태를 PCB1에 저장한다.
5.
PCB0에 저장된 P0의 상태를 불러와 복구한다.
6.
P0를 실행한다.
•
컨텍스트 스위칭은 CPU 레지스터, 캐시 메모리 등의 상태를 저장하고 복원하는 과정에서 오버헤드가 발생할 수 있다. 효율적인 스케줄링 알고리즘과 컨텍스트 스위칭의 최소화를 통해 시스템 성능을 향상시키는 것이 중요하다.