운영체제의 PCB
운영체제(Operating System)에서 프로세스(Process)는 프로그램이 실행 중인 ‘실체’를 의미함.
이때 OS는 프로세스의 상태, 스케줄링 정보, 자원 할당 정보 등을 체계적으로 관리해야 하는데, 이를 위해 사용하는 핵심 자료구조가 바로 PCB(Process Control Block)임.
PCB는 운영체제 커널이 프로세스를 식별하고 제어하기 위해 유지하는 정보의 집합임.
PCB의 개념과 역할
1. 프로세스 식별 및 관리
운영체제가 여러 프로세스를 동시에(시분할, 멀티태스킹) 관리하기 위해서는 각 프로세스를 ‘고유하게 식별’해야 함.
PCB에는 프로세스 식별자로 불리는 PID(Process ID)를 비롯한 여러 정보를 저장하여 운영체제가 프로세스를 구분, 추적, 제어할 수 있도록 함.
2. 상태 전이와 문맥(Context) 보관
프로세스는 준비(Ready), 실행(Running), 대기(Waiting) 등 여러 상태로 전이(State Transition)할 수 있음.
PCB는 프로세스가 어떤 상태인지, CPU 레지스터 등에 담겨 있는 문맥(Context) 정보가 무엇인지 등을 저장해두어 문맥 교환(Context Switch) 시 빠르게 복원할 수 있게 함.
3. 스케줄링과 자원 할당
CPU 스케줄러나 디스패처(Dispatcher)가 어떤 프로세스를 언제 실행할지 결정하려면, 프로세스 우선순위, 사용 시간, 할당된 자원 등의 정보가 필요함.
PCB는 이러한 정보를 일원적으로 관리하여, 스케줄링 결정에 활용함.
PCB에 저장되는 주요 정보
운영체제마다 PCB의 구체적인 구현 세부 사항은 다를 수 있으나, 일반적으로 다음과 같은 정보가 포함됨.
1. 프로세스 식별자(Identifiers)
PID(Process ID): 시스템 내에서 유일하게 프로세스를 식별하는 숫자(또는 핸들).
PPID(Parent Process ID): 부모 프로세스를 가리키는 ID, 프로세스 트리 구조 유지에 사용.
2. 프로세스 상태(Status/State)
Ready, Running, Waiting(Blocked), Terminated 등 현재 프로세스가 어떤 상태인지 기록.
OS는 상태별로 큐(Queue)를 관리하며, 프로세스가 상태를 바꿀 때 PCB에 기록된 상태도 업데이트하고 큐 간 이동을 처리.
3. CPU 레지스터 및 하드웨어 문맥 정보(Context)
프로그램 카운터(Program Counter): 현재 실행 중이거나 다음에 실행할 명령어의 주소.
CPU 레지스터: 일반 목적 레지스터, 부동소수점 레지스터, 스택 포인터, 조건 코드 등 프로세스 실행에 필요한 모든 레지스터 값.
문맥 교환 시 CPU 레지스터 값들을 PCB에 저장하고, 다시 재시작할 때 PCB 내용을 복원하여 실행을 이어감.
4. 스케줄링 및 우선순위 정보
우선순위(Priority): 어떤 스케줄링 알고리즘을 사용하든, OS가 프로세스 실행 순서를 결정할 때 참고할 수 있는 우선순위 값.
스케줄링 큐 정보: 어느 큐(준비 큐, 대기 큐 등)에 속해 있는지, 대기 중인 이벤트나 자원이 무엇인지 기록.
5. 메모리 관리 정보(Memory Management Information)
페이지 테이블(Page Table) 포인터 또는 세그먼트 테이블(Segment Table) 포인터 등, 가상 메모리 매핑 구조를 참조하기 위한 정보.
프로세스가 사용하는 코드 영역, 데이터 영역, 스택 영역의 시작/끝 주소 또는 그에 대한 포인터.
6. 파일/입출력 관리 정보(I/O Status Information)
열린 파일(파일 디스크립터) 목록, 파일 포인터, 현재 I/O 상태(어떤 장치를 사용 중인지, 어떤 이벤트를 기다리는지 등).
각 장치별 자원 할당 정보, 예: 소켓, 파이프 등 IPC(Inter-Process Communication) 자원 정보.
7. 계정/회계(Accounting) 정보
CPU 사용 시간, 실제 수행 시간, 프로세스 생성 시간/종료 시간 등.
시스템 사용료 계산이나 통계, 로깅(logging)에 활용.
8. 기타 커널 관련 정보
신호 처리 정보(UNIX 계열): 어떤 신호를 어떻게 처리할지(핸들러 주소 등), 블록할 신호 목록.
스레드 구조 정보: 스레드를 지원하는 OS에서는 스레드별 TCB(Thread Control Block)와 PCB 간의 관계 정보.
PCB의 생성, 관리 및 소멸 과정
1. 프로세스 생성(Create/Fork)
새로운 프로세스가 생성되면, OS는 새로운 PCB를 할당하여 초기값(PID, 초기 레지스터 상태, 코드/데이터/스택 메모리 정보 등)을 설정함.
UNIX 계열에서는 fork() 시스템 콜이 자식 프로세스를 만들 때 부모 PCB를 복제(clone)하고 일부 항목만 변경함.
2. 프로세스 스케줄링(Dispatch)
준비 큐(Ready Queue)에 있는 PCB 중 하나를 선택(scheduling)해 CPU를 할당(Dispatch)함.
이때 CPU 레지스터 등 문맥 내용을 PCB로부터 CPU로 복원하고, 프로세스 상태를 Running으로 변경함.
3. 문맥 교환(Context Switch)
실행 중이던 프로세스가 타이머 인터럽트, 시스템 콜, I/O 대기 등의 이유로 CPU를 반환하면, OS는 현재 레지스터 상태를 PCB에 저장함.
이어 다음에 실행할 프로세스의 PCB를 읽어, 그 레지스터 상태를 CPU에 복원함.
문맥 교환 비용(Context Switch Overhead)은 상당히 크므로, PCB 관리 구조는 해당 비용을 최소화하기 위해 최대한 효율적으로 설계됨.
4. 프로세스 종료(Terminate)
프로세스가 정상 종료 혹은 에러 종료되면, OS는 해당 PCB를 회수하고(메모리 등 자원 해제), 필요 시 부모 프로세스나 시스템에 종료 상태를 보고함.
이 과정에서 프로세스가 점유하던 자원(파일, 메모리, IPC 등)을 정리해야 하며, PCB 역시 OS 내부의 PCB 테이블에서 제거됨.
PCB의 자료구조 및 구현 측면
1. PCB 테이블(Process Table)
대부분의 OS는 PCB를 관리하기 위해 배열, 연결 리스트, 해시 테이블 등을 이용한 PCB 테이블을 운영함.
예를 들어, 커널 주소 공간에 프로세스 수만큼 PCB가 할당되어 있거나, 프로세스가 동적으로 생성될 때 PCB를 동적 할당(malloc 등)하여 연결 리스트 형태로 관리.
2. PCB와 커널 스택(Kernel Stack)
많은 OS(특히 UNIX/Linux 계열)는 각 프로세스마다 커널 스택(kernel stack)을 별도로 두고, 시스템 콜이나 인터럽트 처리 시에 사용할 스택으로 활용함.
커널 스택은 보통 PCB와 함께(또는 PCB 근처에) 할당되어, PCB가 위치한 주소 공간과 가까운 곳에서 관리되는 경우가 많음.
3. TCB(Thread Control Block)
스레드를 지원하는 시스템에서는, 스레드별로 PCB와 유사한 정보를 저장하는 TCB가 존재함.
프로세스 수준 정보(공유 자원 등)는 PCB에, 스레드 고유 정보(CPU 레지스터, 스택 포인터, 우선순위 등)는 TCB에 저장되는 식으로 역할이 분담됨.
4. 보안 및 권한
PCB에 특정 프로세스가 가진 권한(UID, GID, ACL 등)을 저장하거나, 접근을 제한하는 방식을 통해 보안을 강화함.
OS는 PCB 접근이 필요할 때 커널 모드에서만 접근이 가능하도록 보호하고, 일반 프로세스(유저 모드)는 PCB를 직접 수정할 수 없음.
PCB와 운영체제 설계상의 이슈
1. 문맥 교환 비용 최소화
PCB에 저장해야 하는 정보가 많을수록 문맥 교환 시 저장/복원해야 할 데이터가 늘어나므로, 교환 비용이 커짐
따라서 PCB 설계는 필수 정보만 빠르게 접근 가능하도록 효율적으로 조직해야 함.
2. 프로세스 수 제한 및 동적 확장
최대 프로세스 개수가 고정된 시스템(예: 임베디드)에서는 정적 테이블 할당, 범용 시스템에서는 동적 할당 등 방식을 선택해야 함.
프로세스 수가 많아질수록 PCB 관리도 복잡해지고, 성능 저하를 야기할 수 있으므로, OS 설계에서 최적의 자료구조를 고민해야 함.
3. 멀티코어/멀티프로세서 환경에서의 동기화
여러 코어가 동시에 PCB에 접근할 수 있으므로, 동기화 메커니즘(락, 세마포어 등)이 필요함.
PCB 갱신 시 Race Condition을 방지해야 하며, 동시에 다수 프로세스의 PCB를 액세스할 때 병목이 발생하지 않도록 해야 함.
4. 프로세스/스레드 모델 확장
현대 OS는 프로세스가 여러 스레드를 포함할 수 있으며, 각 스레드마다 TCB가 존재하고, PCB는 이를 총괄.
POSIX Threads(Pthreads), Windows Threads, Linux Threads 등 다양한 스레드 모델에서 PCB와 TCB 간 관계를 어떻게 설계할지도 중요한 이슈임.
정리
PCB(Process Control Block)는 프로세스 실행에 필요한 모든 핵심 정보를 저장하는 운영체제의 자료구조로, 프로세스를 식별·관리·스케줄링·컨텍스트 전환하는 데 사용됨.
PCB에는 프로세스 상태, PID, CPU 레지스터, 메모리 매핑 정보, 파일/I/O 자원 정보, 스케줄링 우선순위 등 다양한 정보가 포함됨.
문맥 교환 시 PCB에 저장된 정보가 사용되어, 실행 중인 프로세스의 CPU 상태를 중단·복원하며, 이는 프로세스 간 멀티태스킹을 가능하게 함.
PCB는 운영체제 커널에서 엄격하게 관리·보호되며, PCB 테이블 또는 링크드 리스트/해시 형태로 구조화됨.
멀티코어, 멀티스레드 환경에서는 PCB와 TCB를 어떻게 설계·관리하고 동기화할지가 중요한 과제이며, 문맥 교환 오버헤드를 최소화하기 위한 자료구조 설계가 운영체제 성능에 큰 영향을 줌,
이처럼 PCB는 운영체제가 프로세스를 제대로 "알고" 제어할 수 있게 하는 필수적인 요소임.
프로세스가 생성될 때부터 종료될 때까지, PCB를 중심으로 프로세스 관리가 이루어지므로, 전문가 수준의 OS 이해를 위해서는 PCB에 대한 구조와 동작 방식을 숙지하는 것이 매우 중요함.
'Operating System > Computer' 카테고리의 다른 글
[Computer] CPU 스케줄링 알고리즘 (0) | 2025.01.26 |
---|---|
[Computer] 자바 표준 스펙 (1) | 2025.01.26 |
[Computer] 메모리 계층 (1) | 2025.01.26 |
[Computer] HTTP 프로토콜 (1) | 2025.01.05 |
[Computer] 웹 통신 프로토콜 (0) | 2024.11.22 |