PCB(Process Control Block)
프로세스 제어 블록이라고도 불리는 PCB는 운영체제에서 프로세스에 대한 메타데이터(프로세스의 정보)를 저장한 구조체를 말한다.
프로세스가 생성되면 운영체제는 해당 PCB를 생성하게 된다. 그 이유는 각각의 프로세스는 프로세스 식별번호(PID)를 할당하게 되는데 운영체제는 다중 프로그래밍을 지원하므로 모든 프로세스를 추적해야 된다. 이때 PCB를 사용하여 프로세스의 실행 상태를 추적한다.
또한 PCB가 만들어지면 CPU에 저장되었다가 프로세스가 완료되면 PCB도 함께 제거된다.
프로세스의 메타데이터들이 PCB에 저장되어 관리된다. 이는 프로세스의 중요한 정보를 포함하고 있기 때문에 일반 사용자가 접근하지 못하도록 보호된 메모리 영역 즉, 커널 스택의 가장 앞부분에서 관리된다.
메타데이터가 저장되어 있기 때문에 프로세스가 한 상태에서 다른 상태로 전환될 경우 운영 체제는 프로세스의 PCB에 있는 정보를 업데이트해야 한다.
PCB의 구조
- Pointer: 프로세스의 현재 위치를 저장하는 포인터 정보이다.
- Process state: 프로세스의 각 상태(생성, 준비, 실행, 대기, 종료)를 저장한다.
- Process Number: 모든 프로세스에는 프로세스 식별자를 저장하는 고유한 ID가 할당되는데 PID라고 불린다.
- Program Counter: 프로세스에서 실행해야 할 다음 명령어의 주소를 포함하는 카운터를 저장한다.
- Registers: 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보이다.
- Memory Limits: 운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보(페이지 테이블, 세그먼트 테이블)가 포함된다.
- Accounting: 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
- Open File Lists: 프로세스를 위해 열린 파일 목록이 포함된다.
운영 체제는 빠르게 PCB에 접근하기 위해서 프로세스 테이블을 사용해 각 프로세스의 PCB를 관리하고 PCB는 연결 리스트 방식으로 관리된다. 프로세스가 생성, 삭제될 때 PCB의 삽입 및 삭제가 용이하다.
Context Switching
PCB를 사용하는 이유로 실행되고 있는 프로세스를 추적 및 관리와 Context Switching을 진행할 때 프로세스의 정보를 저장하기 위해서 사용된다.
Context Switching은 CPU가 현재 작업 중인 프로세스에서 다른 프로세스로 교체되는 기술로 프로세스 스케줄링에서 프로세스를 바꿔주는 기술들에 사용되는 것이 컨텍스트 스위칭이다.
Context Switching 용어를 살펴보면 먼저 Context는 CPU가 프로세스를 실행시키기 위해 필요한 정보들을 뜻한다.
이러한 Context라는 데이터를 Switching 즉, 바꿔주는 것으로 한국말로 문맥 교환이라고 한다.
그렇다면 예를 들어서 X라는 프로세스에서 Y라는 프로세스로 바뀌는 컨스트 스위칭이 발생했다고 생각해 보자.
Y 프로세스의 작업이 모두 종료되면 이전에 실행하고 있었던 X 프로세스로 다시 돌아가야 되는데 X 프로세스로 어떻게 돌아갈 수 있을까?
이때 필요한 것이 바로 PCB이다.
PCB는 이전의 프로세스 정보를 PCB에 저장하고 새롭게 실행할 프로세스의 정보를 PCB에서 읽어와 레지스터에 적재함으로 새로운 프로세스가 종료되었을 때 PCB에 저장된 이전 프로세스를 다시 실행시킬 수 있게 된다.
프로세스가 메모리에 올라가 실행될 때 CPU 내에 존재하는 레지스터들이 현재 실행 중인 프로세스 관련 데이터로 채워지게 되고 실행중인 프로세스가 변경되면 CPU내의 레지스터 값들이 변경된다.
이러한 컨텍스트 스위칭은 언제 발생할까 생각해 보면 어떤 작업이 정지될 때를 생각해 볼 수 있다.
- 우선순위가 높은 프로세스가 준비 상태가 될 때
- 인터럽트가 발생할 때
- 사용자 및 커널 모드로 전환될 때
- 선점형 CPU 스케줄링 알고리즘을 사용할 때
싱글코어 CPU를 기준으로 어떠한 시점에서 실행되고 있는 프로세스는 단 한 개이며 많은 프로세스가 동시에 구동되는 것처럼 보이는 것은 다른 프로세스와 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문이다.
컨텍스트 스위칭에 드는 비용이 바로 캐시미스인데 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 생기므로 캐시클리어 과정을 겪게 되고 이 때문에 캐시미스가 발생한다.
Context Switching 과정
그럼 이제 컨텍스트 스위칭이 어떻게 이뤄지는지 살펴보자.
요청 발생
이전에 살펴봤던 것처럼 컨스트 스위칭은 프로세스가 멈출 때 발생한다. 대표적으로 인터럽트나 시스템 콜이 호출될 경우 기존에 작업 중이던 프로세스는 잠시 멈추게 된다.
PCB에 프로세스 정보를 저장
프로세스가 멈추게 되면 기존에 실행 중이던 프로세스와 관련된 정보들 즉 Context를 PCB0에 저장한다.
CPU 새롭게 할당
기존의 프로세스 정보를 PCB에 저장한 뒤 새롭게 실행할 PCB1을 운영 체제가 가져와서 CPU 레지스터에 적재하고 해당 프로세스를 실행하게 된다.
운영체제는 새롭게 실행할 프로세스에 대한 정보를 해당 PCB에서 가져와 CPU 레지스터에 적재한다.
새로운 프로세스 종료 후 기존 프로세스 다시 실행
간단하게 컨텍스트 스위칭이 수행하는 작업을 정리해 보면
- 현재 실행 중인 프로세스의 context를 백업
- CPU 캐시 비우기
- TLB(Table lookaside buffer) 비우기
- MMU(Memory Management unit) 변경하기
추후에 스레드를 공부해 보면 스레드에도 컨텍스트 스위칭이 있는데 프로세스 컨텍스트 스위칭 보다 더 좋은 성능을 가진다고 한다. 왜 그런 건지는 따로 스레드에 대해서 공부해 보면서 정리해 볼 계획이다.
'CS > OS' 카테고리의 다른 글
운영체제 - 주소 변환 (0) | 2024.06.30 |
---|---|
운영체제 - 주소 공간과 가상 메모리 (0) | 2024.06.30 |
운영체제 - 시스템 콜 (0) | 2024.06.26 |
운영체제 - 인터럽트(Interrupt) (0) | 2024.06.25 |
운영체제 - CPU 스케줄링 알고리즘 (0) | 2023.10.26 |