I'm FanJae.
[Multi Thread] 3. 스레드는 어떻게 동작하는가 (컨텍스트 스위칭과 데이터 레이스) 본문
[멀티 스레드 시리즈 글]
[Multi Thread] 1. 멀티 스레드를 이해하기 위한 기초 (프로그램, 프로세스, 스레드)
[Multi Thread] 2. 호출 스택과 실행 흐름
[Multi Thread] 3. 스레드는 어떻게 동작하는가 (컨텍스트 스위칭과 데이터 레이스)
1. 멀티스레드를 사용하는 이유와 주의점
- 멀티 스레드는 성능을 개선하기 위한 대표적인 기법이다.
- 하지만 모든 상황에서 좋은 결과를 보장하는 것은 아니며, 적절한지 정리할 필요가 있다.
1) I/O 대기 시간 숨기기(Latency Hiding)
- CPU가 아니라 외부 자원 때문에 작업이 지연되는 경우다.
디스크 접근 (DB 조회, 파일 로딩)
네트워크 요청 (게임 서버, API 호출)
- 이러한 작업은 CPU 연산이 아니라 외부 장치의 응답을 기다리는 시간이 대부분이다.
- 문제는 이 기다리는 동안 CPU가 아무 일도 하지 못하고 놀게 된다는 점이다.
- 멀티스레드를 사용하면 한 스레드가 I/O를 기다리는 동안 다른 스레드가 CPU 작업을 수행할 수 있다.
- 느린 장치를 기다리는 시간을 CPU 활용 시간으로 바꾸는 것이다.
※ 예를 들어, 게임 서버에서 유저 데이터 DB에서 읽는 동안 다른 유저 요청을 계속 처리할 수 있다.
2) CPU 자원 병렬 활용
- 최근 CPU는 클럭 속도 증가보다 코어 수 증가 방향으로 발전하고 있다.
싱글 스레드 → 코어 1개만 사용
멀티 스레드 → 여러 코어 동시 사용
- 따라서, 연산량이 많은 작업일 수록 효과가 크다.
- 예를 들면, 아래와 같은 작업이다.
수 판별 같은 반복 연산
물리 연산, 경로 탐색
대량 데이터 처리
※ 즉, 여러 코어를 동시에 사용해서 전체 실행 시간을 줄이기 위한 목적이다.
2. 스레드는 어떻게 동작하는가?
- 멀티스레드를 이해하려면 “정말 동시에 실행되는지”를 구분해야 한다.
1) 동시에 실행되는 것처럼 보이는 이유
- 스레드는 두 가지 방식으로 실행된다.
멀티코어 환경 → 실제로 동시에 실행
싱글코어 또는 스레드 과다 → 번갈아 실행
- 운영체제는 여러 스레드를 짧은 시간 단위로 번갈아서 실행한다.
- 이 과정을 컨텍스트 스위칭(Context Switching) 이라고 한다.
2) 컨텍스트 스위칭과 타임 슬라이스
- 운영체제는 각 스레드에게 CPU를 일정 시간 동안 사용할 수 있도록 할당한다.
- 이 시간 단위를 타임 슬라이스(Time Slice) 라고 한다.
스레드는 타임 슬라이스 동안 실행된다.
이때, 시간이 끝나거나, I/O 요청, 인터럽트 등의 이유로 중단될 수 있다.
이후, 다른 스레드로 실행이 넘어간다. (컨텍스트 스위칭이 진행된다.)
(3) 컨텍스트 스위칭 비용
- 컨텍스트 스위칭이 일어날 때는 다음 작업이 필요하다.
현재 실행 중인 스레드 상태 저장 (레지스터, 스택 등)
다음 스레드 상태 복원
해당 지점부터 실행 재개
- 이 과정이 단순하지 않으며, 꽤 많은 비용이 발생한다는 문제가 있다.
- 따라서, 스레드가 많아질 수록 스위칭이 잦아질수록 오히려 성능이 떨어질 수 있다.

- 이 그림은 단일 CPU 기준이며, 멀티코어에서는 여러 스레드가 동시에 실행될 수 있다.
4) CPU 개수와 스레드 개수의 관계
Runnable ≤ CPU 코어 수 → 동시에 실행 가능 (스위칭 부담 적음)
Runnable > CPU 코어 수 → CPU를 나눠 써야 하므로 컨텍스트 스위칭 증가
- 실행 가능한 스레드가 CPU보다 많아지면 성능 문제가 발생할 수 있다.
5) 컨텍스트 스위칭은 어디서 일어나는가?
- 컨텍스트 스위칭은 코드 한 줄 단위로 일어나지 않는다.
- CPU가 프로그램을 기계어 명령어 단위로 실행하듯, 컨텍스트 스위칭도 이 명령어 실행 흐름 중간에서 발생한다.
※ 문제는 프로그래밍에서 하나의 구문은 실제로 기계어 명령어 여러 개로 컴파일 되는 것에 있다.
b = a * 2;
- 위와 같은 구문이 있다고 하면, 실제로 기계어로는 아래와 같이 작동한다.
r1 = a
r2 = r1 * r2
b = r2
- 대충 이런 느낌이다. r1, r2는 레지스터. a, b는 메모리 공간이다.
- 문제는 컴퓨터가 어디까지 처리하고 컨텍스트 스위치를 일으킬 지 예상할 수가 없다.
이처럼 하나의 구문이 여러 기계어 명령어로 나누어 실행되기 때문에, 그 실행 중간에 컨텍스트 스위칭이 발생하면 예상하지 못한 결과가 발생할 수 있다.
특히 여러 스레드가 동일한 데이터에 동시에 접급하는 경우, 이러한 특성 때문에 데이터가 깨지거나 연산 결과가 틀어지는 문제가 발생한다.
여러 스레드가 동시에 접근해서 데이터 상태를 예측할 수 없게 하는 것을 경쟁 상태 혹은 데이터 레이스(Data Race)라고 하는데 이 문제는 멀티스레드 프로그래밍에서 반드시 고려해야 하는 핵심적인 이슈이다.
'System Programming' 카테고리의 다른 글
| [Multi Thread] 5. 교착 상태(Deadlock)와 해결 방법 (잠금 순서, 재귀 뮤텍스) (0) | 2026.05.03 |
|---|---|
| [Multi Thread] 4. 경쟁 상태와 동기화 (원자성, 일관성, 뮤텍스) (0) | 2026.05.01 |
| [Multi Thread] 2. 호출 스택과 실행 흐름 (0) | 2026.04.26 |
| [Multi Thread] 1. 멀티 스레드를 이해하기 위한 기초 (프로그램, 프로세스, 스레드) (0) | 2026.04.25 |
| [System Programming] 컴퓨터 구조의 접근방법 (4) | 2024.09.20 |