Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

I'm FanJae.

[Multi Thread] 3. 스레드는 어떻게 동작하는가 (컨텍스트 스위칭과 데이터 레이스) 본문

System Programming

[Multi Thread] 3. 스레드는 어떻게 동작하는가 (컨텍스트 스위칭과 데이터 레이스)

FanJae 2026. 4. 28. 22:20

[멀티 스레드 시리즈 글]

[Multi Thread] 1. 멀티 스레드를 이해하기 위한 기초 (프로그램, 프로세스, 스레드)
[Multi Thread] 2. 호출 스택과 실행 흐름
[Multi Thread] 3. 스레드는 어떻게 동작하는가 (컨텍스트 스위칭과 데이터 레이스)

[Multi Thread] 4. 경쟁 상태와 동기화 (원자성, 일관성, 뮤텍스)

[Multi Thread] 5. 교착 상태(Deadlock)와 해결 방법 (잠금 순서, 재귀 뮤텍스)

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)라고 하는데 이 문제는 멀티스레드 프로그래밍에서 반드시 고려해야 하는 핵심적인 이슈이다.

 

 
 
 
 
 
 
 
 
Comments