CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정입니다.
동시성 을 봤듯이 CPU는 한 번에 하나의 프로세스만 실행할 수 있으므로, 여러 개의 프로세스를 번갈아가며 실행하여 CPU 활용률을 높이기 위해 필요합니다.
멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 또는 대기하고 있던 다음 순서의 프로세스가 동작해야 할 때 기존의 프로세스의 상태를 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태로 교체하고 이전에 보관했던 프로세스의 상태를 복구하는 작업입니다.
- 컨텍스트 스위칭을 하는 주체 - 스케쥴러
운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조입니다.
프로세스를 컨텍스트 스위칭할 때 기존 포르세스의 상태를 어딘가에 저장해둬야 다음에 똑같은 작업을 이어서 할 수 있습니다.
새로 해야 할 작업의 상태 또한 알아야 어디서부터 다시 작업을 시작할지 결정할 수 있습니다.

운영체제는 PCB에 담긴 프로세스 고유 정보를 통해 프로세스를 관리하며, 프로세스의 실행 상태를 파악하고, 우선순위를 조정하며, 스케쥴링을 수행하고, 다른 프로세스와의 동기화를 제어합니다.
PCB 내의 정보

🟡 포인터 : 프로세스의 현재 위치를 저장하는 포인터 정보.
🟡 프로세스 상태 : 프로세스의 각 상태를 저장.
🟡 프로세스 아이디 : 프로세스 식별자를 지정하는 고유한 ID
🟡 프로그램 카운터 : 프로세스를 위해 실행될 다음 명령어의 주소를 포함하는 카운터를 저장.
🟡 레지스터 : 베이스, 레지스터 및 범용 레지스터를 포함하는 CPU 레지스터에 있는 정보.
🟡 메모리 제한 : 운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보.
🟡 열린 파일 목록 : 프로세스를 위해 열린 파일 목록.

CPU는 프로세스 P1을 실행.
인터럽트 또는 시스템 call이 발생.
실행 중인인 프로세스 P1의 상태를 PCB1에 저장.
다음으로 실행할 프로세스 P2를 선택. (CPU 스케쥴링)
프로세스 P2의 상태를 PCB2에서 불러옴.
CPU는 프로세스 P2를 실행.
인터럽트 또는 시스템 call이 발생.
현재 실행 중인 프로세스 P2의 상태를 PCB2에 저장.
다시 프로세스 P1을 실행할 차례가 됨. (CPU 스케쥴링)
프로세스 P1의 상태를 PCB1에서 불러옴.
CPU는 프로세스 P1을 중간 시점부터 실행.
컨텍스트 스위칭 과정은 사용자로금 빠른 반응성과 동시성을 제공하지만, 실행되는 프로세스의 변경 과정에서 프로세스의 상태, 레지스터 값 등이 저장되고 불러오는 등의 작업을 수행하기 때문에 시스템에 많은 부담을 줍니다.
P1이 실핼 되고 대기 상태가 될 때 바로 P2가 실행하지 않고 대기 상태에 있다가 실행이 됩니다.
이 간극이 컨텍스트 스위칭 오버헤드입니다.

컨텍스트 스위칭 오버헤드 발생 이유
이 과정에서 메모리 접근 시간 늘어나고, 성능 저하가 발생.
CPU 스케쥴링 알고리즘에 따라 프로세스를 선택하는 비용 문제.
멀티 스레드라면 여러 개의 스레드가 동시에 돌아가서 프로그램 성능이 향상?
-> 정확하지 않습니다.
컨텍스트 스위칭 오버헤드라는 변수때문에 스레드 교체 과정에서 과하게 오버헤드가 발생하면 오히려 멀티 스레드가 싱글 스레드보다 성능이 떨어지는 현상이 나타날 수 있습니다.
쓰레드가 많다면 성능이 항상 좋아질까?
CPU의 캐시 메모리에 저장된 데이터가 무효화?
데이터가 유효하지 않거나 최신 데이터가 아닐 수 있다.
데이터 일관성을 유지하고, 시스템이 항상 최신 데이터를 기반으로 작업할 수 있도록 보장하기 때문에 매우 중요!!!
캐시 메모리의 효율성을 떨어뜨릴 수 있지만, 데이터의 정확성과 프로그램의 신뢰성을 보장하기 위해 필요한 과정입니다.
멀티 스레딩 환경에서 스레드 간의 실행을 전환하는 기술입니다.
프로세스 컨텍스트 스위칭과 다른 점은 스레드 컨텍스트 스위칭은 하나의 프로세스 내의 스레드들을 교환합니다.

PCB처럼, TCB도 각 스레드마다 운영체제에서 유지하는 스레드에 대한 정보를 담고 있는 자료구조입니다.
쓰레드가 프로세스 내에 있는 것처럼 TCB는 PCB 안에 들어있습니다.

TCB도 쓰레드가 생성될 때 운영체제에 의해 생성되며, 쓰레드가 실행을 마치고 소멸될 때 함께 소멸됩니다.
프로세스 컨텍스트 스위칭과 쓰레드 컨텍스트 스위칭은 모두 멀티태스킹 환경에서 여러 프로세스 또는 쓰레드를 동시에 실행하기 위한 기술입니다.
TCB가 PCB보다 가볍다
프로세스 내의 쓰레드들은 text, data, heap 영역의 메모리를 공유하고, TCB에는 stack 및 간단한 register 포인터 정보만을 저장하기 때문에 PCB보다 TCB가 가벼워 더 빨리 읽고 쓸 수 있습니다.
캐시 메모리 초기화 여부
CPU 캐시 메모리는 CPU와 메인 메모리 사이에 위치하며 CPU에서 한번 이상 읽어들인 메모리의 데이터를 저장하고 있다가, CPU가 다시 그 메모리에 저장된 데이터를 요구할 때, 메인 메모리를 통하지 않고 곧바로 데이터를 전달해주는 용도입니다.

프로세스 컨텍스트 스위칭의 경우 다른 프로세스의 실행으로 인해 CPU가 새로운 명령어와 데이터를 로드해야 하기 때문에 CPU 캐시 메모리를 초기화 해야 합니다.
쓰레드 컨텍스트 스위칭의 경우 프로세스 내 쓰레드 간의 스택과 레지스터 값 등 일부 컨텍스트 정보만 변경되므로 CPU 캐시 메모리는 초기화되지 않습니다.
다만 쓰레드가 다른 CPU 코어에서 실행될 때는 해당 코어의 캐시 메모리에 쓰레드 컨텍스트 정보가 로드되어야 하므로 초기화될 수 있습니다.
캐시 초기화의 필요성
- 캐시 무효화
- 캐시는 프로세스가 사용하는 데이터와 명령어가 저장되어 있기 때문에, 프로세스가 전환되면 캐시에 있는 데이터가 더 이상 유효하지 않을 수 있습니다.
- ex) 예를 들어, 데이터베이스에서 데이터가 업데이트되면, 해당 데이터가 캐시에 저장되어 있을 경우, 그 캐시 데이터를 무효화해야 최신 정보를 반영할 수 있습니다.
- 캐시 미스
- 캐시 미스는 프로세서가 요청한 데이터가 캐시에 존재하지 않는 경우를 의미합니다.
- 이 경우, 프로세서는 메인 메모리 또는 다른 저장소에서 데이터를 가져와야 하며, 이로 인해 성능 저하가 발생할 수 있습니다.
- 새로운 프로세스의 명령어와 데이터를 캐시에 로드(CPU가 새로운 프로세스를 실행할 때 해당 프로세스에 필요한 명령어와 데이터를 CPU 캐시에 저장하는 과정.)해야 하므로, 이전 프로세스의 데이터를 제거하고 새로운 데이터를 캐시에 저장합니다.
- 이 과정에서 캐시 미스가 발생하여 메모리 접근 시간이 늘어납니다.
정리
캐시 무효화는 캐시 내의 데이터가 유효하지 않게 되었을 때 이를 무효화하는 과정이며,
캐시 미스는 요청한 데이터가 캐시에 없어서 발생하는 상황입니다.
자원 동기화 문제
쓰레드 컨텍스트 스위칭 발생으로 다른 쓰레드가 heap영역의 공유 데이터에 접근할 때, 이전 쓰레드가 이미 공유 자원을 사용하고 있는 경우 동기화 문제가 발생할 수 있습니다.
ex) 2개의 쓰레드가 동시에 하나의 변수를 수정한다.
쓰레드 컨텍스트 스위칭이 발생하면 변수의 값을 잘못된 값으로 업데이트 해버린다. - 쓰레드 간의 경쟁 조건
프로세스는 기본적으로 독립된 공간이지만, 공유 자원을 사용하는 경우 똑같이 경쟁 조건이 발생할 수 있습니다.
동기화 문제
여러 쓰레드가 동시에 공유 자원에 접근할 때 발생할 수 있는 문제를 의미.
🖇️ 프로세스와 스레드 정리