“Process is a program in execution”
특정 시점을 놓고 봤을 때 프로세스가 어디까지 수행했는지 규명하기 위해 필요한 요소
현재 프로세스가 어떤 상태에 있는지 정확하게 규명하기 위해서는 아래와 같은 것들이 확인되어야 한다.

❓ 문맥을 왜 알아야 하지?
현재 CPU의 context를 잡아두지 않으면 다음번에 CPU를 잡았을 때 앞부분부터 다시 실행해야 한다거나 하는 문제가 생길 것이다.
CPU는 하나뿐이기에 CPU를 잡고 instruction을 수행하고 있는 프로세스는 하나 밖에 없다.
이때문에 프로세스의 상태(state)는 계속해서 변경되며 수행된다.



운영체제의 커널이 데이터 영역에 자료구조로 큐를 만들어 두고, 프로세스의 상태를 바꾸어 가며 이를 파악하고 CPU를 할당한다.
운영체제가 각 프로세스에 대한 중요한 정보를 유지하고 관리하기 위해 사용하는 데이터 구조체
각 프로세스마다 하나의 PCB가 생성되며, 프로세스의 상태, 실행 정보, 자원 등을 추적하는 데 사용된다. 운영체제는 PCB를 통해 프로세스 간의 전환, 자원 할당 및 회수, 프로세스 스케줄링 등을 관리한다.

운영체제는 PCB에 저장된 관리 정보를 사용하여 프로세스를 스케줄링하고 관리한다. 이 정보는 프로세스의 상태와 우선순위, ID와 같은 관리에 필수적인 정보들이다.
프로세스가 CPU에서 실행되던 중 일시 중단되면, CPU의 상태를 저장해야 한다. 이 정보는 프로세스가 다시 실행될 때 정확한 상태에서 재개할 수 있도록 보장해준다.
프로세스는 실행 중에 코드, 데이터, 스택 등의 메모리를 사용한다. 이 메모리의 위치와 관리 정보도 PCB에 저장된다.
프로세스가 실행 중에 열어둔 파일에 대한 정보도 PCB에 저장된다. 운영체제는 프로세스마다 열려있는 파일을 추적하여, 해당 프로세스가 파일을 읽고 쓰는 작업을 제대로 처리할 수 있게 한다.
CPU는 매우 빠른 자원이기 때문에 한 프로세스가 계속해서 독점하지 않고, 짧은 시간 동안 CPU를 사용한 뒤 다시 반환하는 과정을 반복한다. 이때 CPU 사용이 중단된 프로세스는 처음부터 다시 실행되는 것이 아니라, 이전 상태를 기억하고 그 시점부터 이어서 실행될 수 있도록 하는 메커니즘이 필요하다.

💡 시스템 콜이나 인터럽트가 발생할 때 반드시 Context Switch가 일어나는 것은 아니다.
- CPU의 제어권
- 시스템 콜, 인터럽트: 사용자 프로세스 → 운영체제
- Context Switch: 사용자 프로세스 → 또다른 사용자 프로세스
(1)의 경우에도 프로세스의 코드 영역을 실행하다가 커널의 코드를 실행한 것이기 때문에 약간의 문맥은 save되어야 한다. 하지만 문맥 교환을 하는 (2)의 경우 그 부담이 훨씬 크다. (e.g. cache memory flush)
Reference