컨텍스트 스위칭(Context Switching)은 CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정을 의미한다. CPU는 한 번에 하나의 프로세스만 실행할 수 있으므로, 여러 개의 프로세스를 번갈아가며 실행하여 CPU 활용률을 높이기 위해 이러한 컨텍스트 스위칭이 필요하다.
컨텍스트 스위칭을 좀 더 구체적으로 말하자면, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다. 이러한 컨텍스트 스위칭이 일어날 때 다음번 프로세스는 스케줄러가 결정하게 된다. 즉, 컨텍스트 스위칭을 하는 주체는 스케줄러러고 할 수 있다.
위의 사진처럼 Time Quantum동안 프로세스 1,2가 번갈아가면서 실행되고 있는데, 매우 짧은 시간 동안 번갈아가면서 실행되면서 동시에 실행되는 것처럼 보이게 된다. 이렇게 프로세스가 바뀌는 것을 '컨텍스트 스위칭' 이라고 한다.
PCB(프로세스 제어 블록)는 운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조를 말한다.
프로세스를 컨텍스트 스위칭 할때 기존 프로세스의 상태를 어딘가에 저장해 둬야 다음에 똑같은 작업을 이어서 할 수 있을 것이고, 새로 해야 할 작업의 상태 또한 알아야 어디서부터 다시 작업을 시작할지 결정할 수 있을 것이다. 즉, PCB는 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보 저장하는 임시 저장소라고 할 수 있다.
따라서 운영체제는 PCB에 담긴 프로세스 고유 정보를 통해 프로세스를 관리하며, 프로세스의 실행 상태를 파악하고, 우선순위를 조정하며, 스케줄링을 수행하고, 다른 프로세스와의 동기화를 제어한다.
그렇다면 컨텍스트 스위칭은 누구에 의해서 실행될까? 바로 OS의 커널(Kernel)에 의해서 수행이 된다. 커널이란, 운영체제에서도 핵심적인 기능을 담당하는 존재인데 짧게 설명하면 각종 리소스를 관리/감독하는 역할을 하는 존재라고 생각하면 된다.
컨텍스트 스위칭이 일어나는 구체적인 과정을 살펴보면 다른 프로세스끼리의 스위칭(Process Context Switching)인지 같은 프로세스의 스레드들끼리의 스위칭(Thread Context Switching)인지에 따라 다르다. 이 두 가지의 공통점과 차이점을 알아보자.
- 두 스위칭은 모두 커널 모드에서 실행된다.
- 두 스위칭은 또한 모두 CPU의 레지스터 상태를 교체한다.
- 다른 프로세스끼리의 스위칭인 프로세스 컨텍스트 스위칭은 가상 메모리 주소 관련 처리를 추가로 수행함
스레드들끼리는
코드(Code) 영역 : 프로세스가 실행할 코드
데이터(Data) 영역 : 전역 변수가 정적 변수들이 저장되는 영역
힙(Heap) 영역 : 동적으로 할당된 메모리의 영역을 공유하고 스레드들끼리의 컨텍스트 스위칭은 같은 프로세스에 속하기 때문에 스위칭이 일어나도 메모리와 관련해서는 챙겨줘야 할 부분이 없다. 하지만, 프로세스간의 컨텍스트 스위칭이 발생했을 때에는 메모리 주소 체계가 다르기 때문에 이 때는 메모리 주소 관련된 처리를 추가로 수행해야 한다.
그렇기 때문에, MMU(Memory Management Unit)와 TLB(Translation Lookaside Buffer)도 관리를 해줘야 합니다.
MMU는 가상 메모리와 물리 메모리 사이의 주소 변환을 담당하는데, 프로세스가 물리 메모리에서 할당되는 위치를 추상화하여 각 프로세스가 독립적인 주소 공간을 가지고 있는 것처럼 만든다.TLB는 MMU 내에 존재하는 캐시 메모리로, 가상 주소를 물리 주소로 변환하는 과정을 상대적으로 느릴 수 있기 때문에, 이러한 변환의 결과를 TLB에 저장해 두고 빠르게 사용하는 데에 목적이 있다.
요약하자면 다른 프로세스끼리의 스위칭은 주소 체계와 관련된 일들도 추가적으로 처리를 해야 하고,
이러한 추가적인 작업이 필요하기 때문에 프로세스 컨텍스트 스위칭보다 스레드 컨텍스트 스위칭이 더 빠르다.
컨텍스트 스위칭이 발생하면서, 캐시 오염(Cache Pollution)이라는 간접적인 영향이 발생하게 된다.
캐시 메모리는 결국 메인 메모리에 비해 매우 작기 때문에 프로세스끼리 나눠서 쓰지 않고 다 같이 사용하는 공간이기 때문에 위와 같은 문제가 발생하게 된다.