1. PCB(Process Control Block)란?
- 운영체제가 프로세스의 메타데이터를 저장해 놓을 수 있는 저장 장소를 뜻합니다. 프로세스는 운영체제가 부팅 과정을 통해 RAM으로 이동해서 컴퓨터를 장악한 후에 프로세스가 여러개 실행됩니다. 이때 프로세스 생성될 때 PCB라는 곳에 저장됩니다.
- 메타 데이터를 통해 CPU는 각 프로세스를 구분할 수 있고, 이를 통해 프로세스가 여러개가 되었을 때 전부 관리 할 수 있습니다. (프로세스 여러 개를 CPU 스케줄링을 통해 관리하는 것을 Process Management라고 부릅니다.)
- PCB는 운영체제가 해당 프로세스를 위해 관리하는 데이터 구조이기 때문에 운영체제 영역에 만들어 집니다.
[Metadata의 생성과 PCB]
- 프로그램이 실행을 하면, 프로그램을 메모리에 적재되면서 프로세스를 생성합니다.
- 그리고 프로세스의 메타 데이터를 생성합니다.
- 이 메타 데이터를 PCB에 저장합니다. (하나의 PCB에는 하나의 프로세스 정보가 담깁니다.)
[PCB 구성 요소]
1. 포인터
- PCB 첫번째 블록에는 포인터가 저장됩니다. 준비 상태나 대기 상태의 큐를 구현할 때 사용합니다.
2. 프로세스 상태
- 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등의 프로세스 상태를 저장합니다.
3. 프로세스 구분자 PID
- 운영체제 내의 여러 프로세스를 구별하기 위한 구분자를 저장합니다.
4. 프로그램 카운터
- 프로세스가 수행되다가 중단 될 때, 다음에 실행될 명령어의 위치를 가리키는 명령어 주소를 저장합니다.
5. 프로그램 우선순위
- 하나의 프로그램은 여러 개의 프로세스로 나뉩니다. 그러나 모든 프로세스가 핵심은 아니고, 가장 중심을 잡는 프로세스가 있고 핵심 프로세스를 보조해주는 프로세스가 있습니다. 핵심 프로세스를 부모 프로세스, 보조 프로세스를 자식 프로세스라고 부릅니다. 그러므로 부모 프로세스가 다른 프로세스보다 우선순위가 높아야 합니다.
6. 레지스터 정보
- 프로세스 실행 중에 사용하던 레지스터(accumulator, index register, stack pointer 등)의 값이 저장됩니다.
7. 메모리 관리 정보
- 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등이 저장됩니다. segmentation table, page table 등의 정보도 보관합니다.
8. 할당된 자원 정보
- 프로세스 실행을 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보를 저장합니다.
9. 계정 정보
- 계정 번호, CPU 할당 시간, CPU 사용 시간 등을 저장합니다.
10. PPID, CPID
- 부모 프로세스를 가리키는 PPID와 자식 프로세스를 가리키는 CPID 정보를 저장합니다.
[PCB가 필요한 이유]
- CPU에서는 프로세스의 상태에 따라 실행할 프로세스를 바꾸는 작업을 진행합니다. 이때, 교체되는 프로세스의 상태 값을 PCB에 저장해 두었다가 앞으로 다시 수행할 때 사용합니다.
- 예를 들면 Interrupt가 발생하면 현재 진행하고 있는 프로세스는 Wating 상태로 변경을 하고 Interrupt 걸어온 프로세스를 Running 상태로 변경하고 작업을 진행합니다.
- 즉, 프로세스 상태 관리와 문맥교환(Context Switching)을 위해 필요합니다.
[PCB의 관리 방식]
- Linked List 방식으로 관리되어, List Header에 PCB가 삽입됩니다. 그리고 Linked List는 주소 값으로 연결이 이루어져 있는 연결리스트이기 때문에 삽입, 삭제가 용이합니다. 즉, 프로세스가 생성되면 해당 PCB가 생성되고 프로세스 완료시 제거됩니다.
2. Context Switching
- 수행 중인 프로세스를 변경할 때, CPU의 레지스터 정보가 변경되는 것을 Context Switching 이라고 합니다.
- CPU가 이전의 프로세스 상태를 PCB에 보관하고, 또 다른 프로세스의 정보를 PCB에 읽어 레지스터에 적재하는 과정입니다. 즉, 프로세스가 Ready -> Running, Running-> Ready, Running -> Waiting 처럼 상태가 변경시 Context Switching가 발생합니다.
[Context Switching의 OverHead]
- 문맥교환이 발생하면 시간과 메모리가 소요되므로 잦은 문맥교환은 성능 저하를 가져옵니다. 그렇다고 I/O 이벤트가 발생했을 때, 해당 이벤트가 끝날 때 까지 기다리면 CPU를 점유하고 있어도 아무런 작업도 할 수 없기 때문에 CPU가 낭비됩니다. 때문에, 오베헤드를 감수하면서 기존 프로세스를 새 프로세스로 바꾸는 것이 더 효율적입니다.
- 그리고 멀티태스킹에서 시간 할당량이 적어지면 문맥 교환의 수와 오버헤드가 증가하지만 동시에 더 많은 프로세스를 수행할 수 있고, 시간 할당량이 커지면 문맥 교환의 수와 오버헤드는 감소하지만 더 적은 프로세스를 동시에 수행할 수 있습니다.
[Context Switching 시나리오]
1) P0 프로세스가 인터럽트를 받으면서 PCB0에 P0 프로세스의 상태 정보를 저장합니다.
2) 다음 수행될 P1 프로세스의 PCB1에서 P1 프로세스의 상태 정보가 CPU에 재로딩 됩니다.
3) P1 프로세스를 일정 시간 수행합니다.
4) P1 프로세스가 인터럽트를 받으면서 PCB1에 P1 프로세스의 상태 정보를 저장합니다.
5) 다음 수행할 P0 프로세스의 PCB0에서 P1 프로세스의 상태 정보가 CPU에 재로딩 됩니다.
6) P0 프로세스를 일정시간 수행합니다.
Reference
https://velog.io/@klloo/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-PCB%EC%99%80-Context-Switching
'개발 > 개발노트' 카테고리의 다른 글
TDD(Test Driven Development)에 대해서 (0) | 2023.05.03 |
---|---|
[운영체제] CPU 스케줄링 (0) | 2023.04.22 |
[Web] Web Server? WAS? (0) | 2023.04.15 |
[Network] REST, REST API, RESTful (0) | 2023.04.12 |
[Network] Blocking I/O, Non-blocking I/O (0) | 2023.04.08 |