PCB는 OS가 Process를 제어하기 위한 자료구조이다. PCB는 Context Switching을 위해 필요하다고 한다. 그러면 여기서, 4가지 궁금증이 생긴다.
- Context Switching은 무엇이며, 왜 필요한지.
- PCB는 어떻게 구성되어 있는가.
- PCB가 "Process" Control Block 이라면, "Thread" Control Block은 어떻게 구성되어 있는가.
- Thread Context Switching은 어떻게 진행되는가.
현재 진행하고 있는 Task의 상태를 저장하고, 다음에 진행할 Task의 상태 정보를 읽어와 진행하는 것을 뜻한다.
Computer의 자원이 한정되어 있기 때문이다. AMD의 스레드리퍼를 쓰지 않는한 우리의 CPU의 스레드는 아무리 많아도 256은 커녕 128스레드도 되지 않는다. 하지만, 지금 실행되고 있는 프로세스를 확인해보면, 100개는 훌쩍 넘을 것이다. 이러한 프로세스를 모두 동시에 사용하는 것처럼 하기 위해서 Context switching이 필요하게 된다.
빠른 속도로 Task를 바꾸어가며 실행하여 모든 프로세스가 동시에 실행되고 있는 것처럼 보이게 하기 위하여 Context Switching을 한다.
Context Switching을 위하여, OS는 PID, process state, program counter, etc.. 와 같은 현재 진행중인 process에 대한 정보들을 PCB의 형태로 다룬다. 이러한 PCB를 저장하고, 불러오는 과정을 통하여 Task의 정보를 저장을 하고, Context switching을 진행을 한다.
PCB에는 Process의 Metadata를 저장하고, 저장되어있다.
- PID : Process-id로, process의 고유값이다
- process-state : process의 life-cycle에서의 상태를 의미한다. 이따가 자세히 보자.
- priority : OS가 process-scheduling을 할때 사용되는 값이다.
- Process Accounting Information : CPU를 사용한 시간, CPU 할당 시간 등이 있다
- Program Counter : 다음 작업할 명령어 위치를 기억한다
- List of Open Files : 실행 중에 프로그램에 필요한 모든 파일의 정보를 포함한다
- Process I/0 status information : 해당 프로세스가 실행 중에 할당을 요구한 I/O 장치에 대한 정보를 담는다.
- CPU register : Assembly를 해본적이 있다면 잊을수가 없다. 다양한 flags, 범용 registers 등이 여기에 속한다. PCB에 이 값을 저장하였다가, context-switching으로 돌아왔을 때 register의 값을 저장된 값으로 바꾼다.
- PCB Pointer : 준비중인 다음 프로세스의 주소를 가리킨다.
- Memory management information : page table과 segment table을 저장한다.
- PPID, CPID : parent PID, child PID
TCB는 Thread Control Block의 약자로, OS에서 Thread를 다루기 위해 사용하는 자료구조이다.
TCB는 다음과 같은 정보를 갖는다.
- TID: 고유의 id이다.
- Stack pointer: 각각의 thread는 stack영역을 할당받는데, 자신에게 할당되어 있는 stack의 현재 위치를 point한다.
- Program counter: PC는 PC다.
- thread의 state
running, ready, waiting, start, done- Thread's register values
- 소속되어 있는 process의 주소
Thread context-Switching의 주체는 OS가 될 수도 있지만, 특정 library가 담당하기도 한다.
process context-switching이 발생하면, 진행하던 cache의 내용은 새로 진행해야되는 process에서는 무용지물이 되어버린다. 하지만, thread context-switching 에서는 꼭 그렇지만은 않다. 2가지 이유가 있다.
1. 같은 process에 속해있는 thread 이기에, 많은 자원들을 공유한다. 그렇기에, 가상메모리 공간을 바꿀 필요가 없다.
2. Cache에 이미 두 thread가 공유하는 data가 올라가있다. 또한, Cache memory에 data를 가져올 때는, 필요한 data 만을 가져오는게 아니라, 주변에 있는 data도 같이 가져오게 된다. Cache는 locality 라는 특성을 갖고있기 때문에, 이 과정에서 새로 실행하게 되는 thread에서 사용하는 data 또한, cache memory에 이미 적재되어 있을 가능성이 높다.
이러한 이유로, thread context-switching의 overhead는 process context-switching의 overhead 보다 적다.