하나의 프로세스가 CPU를 사용중이던 상태에서, 스케줄러의 인터럽트 요청에 의해 다른 프로세스가 CPU를 사용할 수 있도록 하기 위해 이전의 프로세스의 상태(문맥, Context)를 저장하고 새로운 프로세스의 상태를 적재하는 작업을 말한다.
한번에 하나의 Task(Process, Thread) 만 수행한다면 다음 Task 는 앞의 Task 가 끝나기를 기다릴 수 밖에 없을 것이다.
한번에 하나의 Task 만 수행할 수 있는 CPU 는 여러 개의 Task 를 동시에 수행하기 위한 방법으로 빠른 속도로 Task 를 바꿔가며 실행한다고 한다. 이렇게 빠른 속도로 여러 개의 Task 를 번갈아가며 수행하면 사람의 눈으로는 여러 개의 Task 가 동시에 수행되는 것처럼 느끼게 된다. Task 를 바꿔가면서 실행하기 위해 필요한게 바로 Context Switching 이다.
하지만, Context Switching 이 진행되는 동안 CPU는 아무 것도 수행하지 못하기 때문에 overhead 가 발생한다. 이 외에도 Cache 초기화, Memory Mapping 초기화 등 많은 비용이 소모된다. 이렇게 overhead 가 발생하는데 Context Switching 을 하는 이유는 뭘까?
I/O Event 가 발생하면 프로세스는 waiting 상태로 전환된다. 그럼 CPU 는 아무런 일도 하지 않는데 여기서 CPU 낭비가 발생한다.
overhead 가 발생하면서 생기는 낭비보다 waiting 상태에서 아무런 일을 하지 않아 생기는 낭비가 더 크기 때문에 Context Switching 을 통해서 다른 프로세스를 실행하는게 더 효율적이다.
Context Switching 은 Stack 영역을 제외한 모든 메모리를 공유하는 쓰레드가 프로세스보다 더 효율적이다.
수행중이던 Task 의 정보는 레지스터에 저장되고 이는 PCB 로 관리가 된다.
인터럽트 (Interrupt) 는 CPU 가 프로그램을 실행하고 있을 때 실행중인 프로그램 밖에서 예외 상황이 발생해 처리가 필요한 경우 CPU 에게 이를 알려 예외 상황을 처리할 수 있도록 하는 것을 말한다.
Context Switching 을 일으키는 Interrupt 는 아래와 같다.