- 컨텍스트 스위칭이란 CPU가 여러 프로세스나 스레드를 번갈아 가며 실행하기 위해 프로세스나 스레드의 상태(Context)를 저장하고 복구하는 과정
- 컨텍스트(Context): 프로세스 또는 스레드가 CPU에서 실행되던 상태(레지스터, 프로그램 카운터, 스택 포인터 등)를 의미
- 컨텍스트 스위칭은 멀티태스킹 운영체제에서 CPU가 여러 프로세스를 동시에 실행하는 것처럼 보이게 하기 위해 사용됨
- 기존 실행 중이던 프로세스의 작업 상태는 메모리의 PCB에 저장해두고 CPU 에서 나옴. 다음번에 실행 중이던 프로세스의 상태 정보를 메모리 내의 PCB 에서 가져와서 CPU에 복구함
- 즉, 실행 중이던 작업 내용(Context)을 메모리내의 PCB에서 저장하고 복구하여 CPU에서 번갈아 사용하는 것
- 요리사가 여러 주문서를 처리할 때 13번의 주문서의 새우 튀김을 만든 다음 14번의 등심 요리를 하는 과정으로 요리 작업의 전환 과정은 2개의 주문서를 교환(switching)함으로써 이루어짐
- 요리 작업을 전환할 때 주문서를 교환하는 것만이 아닌 해당 재료와 도구를 치우고 새로운 재료와 도구를 가져와야 함. 즉 전환 과정은 주문서를 바꾸는 것과 동시에 작업 환경을 바꾸는 것임
- 문맥 교환은 이처럼 CPU를 처리하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말하는데 이때 두 프로세스 제어 블록의 내용이 변경됨
- 실행 상태에서 나가는 프로세스 제어 블록에는 지금까지의 작업 내용을 저장하고, 반대로 실행 상태에서 들어오는 프로세스 제어 블록의 내용으로 CPU가 다시 세팅됨
- 문맥 교환이 되는 경우는 매우 다양한데 이는 다음과 같음
- 일반적으로는 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생
- 인터럽트가 걸렸을 경우 발생하며 예를 들어 어떤 프로세스가 자신에게 주어진 메모리 공간을 넘어가려 한다면 이는 경계 레지스터의 범위를 벗어나는 것인데 이때 인터럽트가 발생하여 현재 실행 중인 프로세스의 제어 블록을 저장한 후 인터럽트 관리 프로세스를 실행 상태로 만듬
- 인터럽트 관리 프로세스는 메모리 범위를 넘어선 프로세스를 강제로 종료하고 인터럽트 처리를 마치는데 이와 같이 인터럽트 처리를 할 때도 문맥 교환이 일어남
- 각 프로세스는 자신의 상태(프로그램 카운터, 레지스터 값, 스택 포인터 등)를 저장하기 위한 고유한 PCB를 가지고 있음
- PCB는 프로세스가 생성될 때 운영체제에 의해 생성되며, 프로세스가 종료될 때까지 해당 프로세스의 상태 정보를 유지함
- PCB는 운영체제가 관리하며, 운영체제는 PCB를 통해 실행 중인 프로세스의 상태를 추적
- 운영체제는 프로세스 스케줄링을 할 때, 각 프로세스의 PCB를 참조하여 어떤 프로세스를 실행할지 결정
- 프로세스 상태(예: 실행 중, 준비 상태, 대기 상태 등)는 PCB에 기록되며, 운영체제가 프로세스의 상태를 관리할 때 사용됨
- **문맥 교환(Context Switching)**이 발생하면, 운영체제는 현재 실행 중인 프로세스의 상태를 해당 프로세스의 PCB에 저장하고, 다음에 실행할 프로세스의 PCB에서 정보를 가져와 CPU에 복구
- 메모리에서 PCB를 저장하는 이유는 프로세스를 실행시키기 위해 PCB를 가져오는데 이걸 메모리에 저장해두고 있다가 프로세스가 실행 종료될 때까지 메모리에 관리하고 있는 것
- 즉, 프로세스가 중단되거나 문맥 교환이 발생하면 해당 작업 상태를 PCB에 저장하고 이후 관리를 위해 메모리에 남음
- PCB는 각 프로세스마다 존재하며, 운영체제가 메모리에서 PCB를 관리
- 운영체제는 모든 프로세스의 PCB 목록을 관리하며, 필요할 때마다 PCB에 접근해 프로세스 상태를 기록하고, 문맥 교환 시 해당 정보를 사용해 프로세스 간 전환을 수행함0
- 문맥 교환이나 스케줄링 시, 운영체제는 해당 프로세스의 PCB를 읽고 수정하면서 그 프로세스의 상태를 업데이트하고, CPU에서 실행을 관리함
- 실행 상태에 있는 P1이 자신에게 주어진 시간을 다 사용하여 타임아웃이 발생
- P1의 프로세스 제어 블록(PCB)에 현재까지의 작업 상태가 저장되고 P1은 준비 상태로 쫓겨나 CPU를 사용하지 않고 대기
- PCB의 해당 상태 정보는 메모리에 저장됨
- 새로 실행될 준비 상태에 있던 프로세스 P2가 실행 상태로 가면(dispatch) CPU의 레지스터가 P2의 프로세스 제어 블록 값으로 채워짐
- 새로 실행될 프로세스의 이전 상태를 PCB를 메모리에서 가져와 복구
- 복구된 상태를 바탕으로 새 프로세스가 CPU에서 실행됨
- 프로세스는 독립적인 메모리 공간을 가지고 있으므로, 프로세스 간의 컨텍스트 스위칭에서는 전체 메모리 상태(코드, 데이터, 스택, 힙)와 CPU 상태(레지스터 값)를 모두 저장하고 복구함
- 프로세스 스위칭은 상대적으로 더 많은 오버헤드가 발생하며, 주소 공간 전환이 필요
- 운영체제가 프로세스 간 주소 공간을 변경해야 하기 때문에 더 많은 오버헤드가 발생하는 것
- 스레드는 같은 프로세스 내에서 메모리 공간을 공유하므로 스레드 간의 컨텍스트 스위칭은 프로세스의 주소 공간을 바꾸지 않고, 해당 스레드의 스택, 레지스터, 프로그램 카운터 등만 저장하고 복구하면 됨
- 스레드의 컨텍스트 스위칭은 비교적 더 가볍고 빠르며, 스레드 간 공유 자원에 대한 전환이 이루어지기 때문에 프로세스 간 스위칭보다 오버헤드가 적음
- 커널 스택(Kernel Stack)은 각 프로세스마다 따로 할당된 커널 모드에서 사용하는 스택으로 컨텍스트 스위칭이 발생할 때 프로세스의 상태 정보가 커널 스택에 저장됨
- 컨텍스트 스위칭이 일어나면 실행 중이던 프로세스의 CPU 상태를 PCB에 저장 해야하는데 이때 커널 스택이 이 정보를 일시적으로 저장하는 역할을 함
- 현재 실행 중인 프로세스가 컨텍스트 스위칭으로 인해 실행 중단
- 문맥 교환이 발생하여 인터럽트나 시스템 호출을 통해 프로세스가 커널 모드로 전환되고 각 프로세스에 할당된 커널 스택이 활성화 됨
- CPU가 현재 실행 중이던 프로세스의 레지스터 값을 커널 스택에 저장함
- 해당 커널 스택에 임시 저장된 프로세스 상태 정보는 이후 프로세스의 PCB에 저장됨. 이후 현재까지의 작업 상태를 복구하는데 사용됨
- 이제 CPU가 다른 프로세스를 실행할 준비를 하여 커널 스택에 저장된 상태 정보는 PCB로 이동되고 CPU는 새로운 프로세스의 정보를 커널 스택을 통해 복구함
- 임시로 커널 스택에 저장하는 이유는 커널 스택은 레지스터나 CPU 상태 정보를 즉시 저장할 수 있는 매우 빠른 메모리로 CPU는 실행 중이던 프로세스가 중단될 때 레지스터 값을 빠르게 저장하고 스케줄러가 이를 처리할 수 있게 함
- PCB는 메모리 구조가 더 크고 복잡하기 때문에, 직접 PCB에 모든 정보를 저장하려면 추가적인 오버헤드가 발생할 수 있어 커널 스택을 통해 빠르게 저장하고 이후 PCB에 저장
- 프로세스마다 고유한 커널 스택을 가지므로, 여러 프로세스의 상태 정보를 동시에 안전하게 관리할 수 있음
- 커널 스택은 커널 모드에서만 접근 가능하므로 프로세스가 중단되거나 문맥 교환이 발생할 때 사용자 스택을 그대로 사용할 경우 보안 문제나 데이터 손상 위험을 방지
- 일반적으로 다중 프로세싱 환경에서 프로세스 또는 스레드 전환이 필요할 때 발생
- 타임 슬라이스 종료 (타임아웃)
- CPU 스케줄러는 각 프로세스에 정해진 시간 동안만 CPU를 할당되고 이 시간이 종료되면 컨텍스트 스위칭이 발생하여 다음 프로세스로 전환됨
- 입출력(I/O) 대기
- 프로세스가 I/O 작업을 요청하면, I/O가 완료될 때까지 대기 상태로 전환되며 그동안 다른 프로세스가 CPU를 사용할 수 있도록 컨텍스트 스위칭이 발생
- 프로세스의 종료 또는 중단
- 현재 실행 중이던 프로세스가 종료되거나 중단되면, 다른 프로세스를 실행하기 위해 컨텍스트 스위칭이 발생
- 우선순위 변경
- 스케줄러가 우선순위가 더 높은 프로세스를 실행해야 할 경우, 현재 프로세스를 중단시키고 우선순위가 높은 프로세스로 전환됨
- 인터럽트
- 하드웨어 또는 소프트웨어 인터럽트가 발생했을 때, 인터럽트를 처리하기 위해 컨텍스트 스위칭이 일어날 수 있음