컨텍스트 스위칭
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 발생 |
| 인터럽트 | 하드웨어 신호 발생 |
| 우선순위 선점 | 높은 우선순위 프로세스 등장 |
컨텍스트 스위칭은 동시성을 구현하기 위한 필수 비용입니다. 너무 잦은 전환은 오히려 실제 작업보다 전환 비용이 커져 성능 저하로 이어지므로, 스레드 수를 적절히 제한하는 것이 중요합니다.