컨텍스트 스위칭

CPU가 현재 실행 중인 프로세스/스레드를 멈추고 다른 프로세스/스레드로 전환하는 것입니다.

동작 방식

CPU는 한 번에 하나의 작업만 실행 가능
→ 여러 작업을 번갈아 실행해서 동시에 실행되는 것처럼 보임

시간 →
[프로세스A] → 저장 → [프로세스B] → 저장 → [프로세스A]
              ↑ 컨텍스트 스위칭

컨텍스트란?

컨텍스트 = 프로세스/스레드의 현재 상태 정보

├── PC (Program Counter) : 다음 실행할 명령어 주소
├── 레지스터 값          : CPU 연산 중간 값
├── 스택 포인터          : 현재 스택 위치
└── 메모리 정보          : 사용 중인 메모리 주소

전환 과정

1. 프로세스A 실행 중
        ↓
2. 인터럽트 발생 (타이머, I/O 등)
        ↓
3. 프로세스A의 컨텍스트를 PCB에 저장
        ↓
4. 프로세스B의 컨텍스트를 PCB에서 복원
        ↓
5. 프로세스B 실행

PCB (Process Control Block)
= 프로세스 정보를 저장하는 자료구조

프로세스 vs 스레드 컨텍스트 스위칭

프로세스 컨텍스트 스위칭
→ 메모리 공간 자체가 바뀜 (가상 메모리 교체)
→ 캐시 초기화 필요
→ 비용 매우 큼 X

스레드 컨텍스트 스위칭
→ 같은 프로세스 내에서 전환
→ 메모리 공간 공유 (교체 불필요)
→ 레지스터/스택만 교체
→ 비용 상대적으로 작음 O

컨텍스트 스위칭 비용

저장/복원 비용
→ PCB에 현재 상태 저장 + 새 상태 복원

캐시 오염 (Cache Miss)
→ CPU 캐시는 현재 프로세스 데이터로 채워짐
→ 전환 후 새 프로세스 데이터로 교체 필요
→ 초반 Cache Miss 급증 → 성능 저하

유휴 시간
→ 전환하는 동안 CPU가 아무 작업도 못 함

Java에서의 영향

// X 스레드 과다 생성 → 컨텍스트 스위칭 폭증
for (int i = 0; i < 10000; i++) {
    new Thread(() -> doWork()).start();
}

// O 스레드풀로 스레드 수 제한
ExecutorService executor = Executors.newFixedThreadPool(
    Runtime.getRuntime().availableProcessors()  // CPU 코어 수에 맞게
);
executor.submit(() -> doWork());

언제 발생하나?

원인설명
타임 슬라이스 만료CPU 사용 시간 초과
I/O 대기파일/네트워크 등 I/O 발생
인터럽트하드웨어 신호 발생
우선순위 선점높은 우선순위 프로세스 등장

컨텍스트 스위칭은 동시성을 구현하기 위한 필수 비용입니다. 너무 잦은 전환은 오히려 실제 작업보다 전환 비용이 커져 성능 저하로 이어지므로, 스레드 수를 적절히 제한하는 것이 중요합니다.

CSLOG에서 보기