Context Switching은 CPU가 현재 작업의 실행 상태를 저장하고 다른 작업의 상태를 복원해 실행 대상을 바꾸는 과정입니다. 프로세스 사이뿐 아니라 같은 프로세스의 스레드 사이에서도 발생합니다.
비용은 크게 두 가지입니다.
- 직접 비용: 레지스터·프로그램 카운터·스택 포인터 저장과 복원, 스케줄러 실행 등의 작업이 필요합니다.
- 간접 비용: 실행 대상이 바뀌면서 CPU 캐시 적중률이 떨어질 수 있고, 주소 공간이 달라지면 주소 변환 캐시인 TLB의 재활용에도 영향을 줍니다.
같은 프로세스의 스레드끼리는 주소 공간을 바꾸지 않아 대체로 비용이 작습니다. 다만 컨텍스트 스위칭이 잦으면 실제 작업에 쓸 CPU 시간이 줄어듭니다.
시스템 콜이 발생하면 항상 컨텍스트 스위칭이 발생하나요?
아닙니다. 시스템 콜은 사용자 모드에서 커널 모드로 전환되지만, 같은 스레드가 커널 작업을 수행하고 돌아올 수 있습니다. 대기나 선점 때문에 실행 대상까지 바뀔 때 문맥 교환이 발생합니다.
문맥 교환이 일어나면 캐시와 TLB를 모두 비우나요?
CPU 캐시를 매번 전부 비우는 것은 아닙니다. TLB도 ASID 같은 주소 공간 식별자를 지원하면 여러 프로세스의 변환 정보를 구분해 유지할 수 있으므로, 무효화 범위는 하드웨어와 운영체제 구현에 따라 달라집니다.
자발적 문맥 교환과 비자발적 문맥 교환은 어떻게 다른가요?
자발적 문맥 교환은 I/O나 잠금 대기 등으로 작업이 CPU를 내놓을 때 발생합니다. 비자발적 문맥 교환은 타임 슬라이스 소진이나 더 높은 우선순위 작업의 실행 등으로 선점될 때 발생합니다.
Context Switching을 줄이려면 어떻게 해야 하나요?
작업 수보다 지나치게 많은 스레드·프로세스를 만들지 않도록 풀 크기를 조정하고, 작은 작업을 적절히 묶으며, 긴 락 대기와 불필요한 블로킹을 줄여야 합니다. I/O가 많은 환경에서는 Non-blocking I/O나 Virtual Thread처럼 대기 중 OS 스레드 점유를 줄이는 모델을 검토할 수 있습니다. 최적값은 작업 특성에 따라 달라지므로 실제 문맥 교환 횟수, CPU 사용률, 처리량과 응답 시간을 측정해 조정해야 합니다.