스레드란?
스레드란 프로세스 내의 실행 흐름으로 프로세스보다 작은 단위다.
프로세스에서 제공하는 Protection Domain은 없다.
스레드가 나오게 된 배경
하나의 프로세스에는 하나의 Control만이 존재하기 때문에, 한 번에 하나의 일만 처리할 수 있다.
프로세스에서 할 작업을 여러 개로 쪼갠 뒤 각각을 스레드화하면 작업을 병렬적으로 처리할 수 있다.
Cooperative Process와의 비교
Cooperative Process는 IPC가 필요하기 때문에 비용이 많이 든다.
프로세스 내에서 Cooperate하는 스레드를 만든다면 보다 적은 비용으로 Cooperative Process가 하는 일을 동일하게 수행 가능하다.
프로세스와 스레드
프로세스간프로세스 간 메모리 영역은 독립적이므로 서로의 영역에 접근하기 어려우며 프로세스 간의 Switch 비용이 크다.
반면에 스레드는 하나의 프로세스안에 여러 개로 존재하여 프로세스의 메모리 영역은 스레드 간에 공유가 되므로 스레드 간의 Switch 비용이 적다.
스레드의 구성요소
Thread ID - 스레드 식별자
Program Counter - 현재 실행중인 Instruction의 주소
Register Set - CPU의 Register 값들
Stack
싱글스레드와 멀티스레드

멀티스레드 프로그램의 장점
- 성능 향상 - 여러 스레드가 병렬적으로 작업을 수행
- 응답성 향상 - 한 스레드가 오래 걸리거나 중단되어도 다른 스레드는 여전히 수행가능
멀티스레드 프로그램의 주의점
- 적당한 동기화 필요 - 과한 동기화는 성능 하락으로 이어지기 때문에 trade off를 잘 고려해서 구현해야 함
- 스레드가 많다고 꼭 좋은것은 아님
두 가지의 멀티스레드 스타일
종류 | Heterogeneous | Homogeneous |
작동 방식 | 역할에 따라 한 Thread는 한가지 일만 맡아 수행 | 역할 관계없이 작업이 생길 경우 아무 Thread로 수행 Job(Task | Worker thread) pool |
장점 | 구현이 쉬움 싱글→멀티스레드로 변환 쉬움 |
제한없는 병렬성 - CPU(코어) 수의 증가는 곧 성능 증가 |
단점 | 구현해놓은 스레드 이상으로는 성능향상 없음 | 이미 구현된 싱글스레드 프로그램을 변환하기 힘듬 |
추천 | 이미 싱글스레드로 짜여진 프로그램을 변환하는 경우 | 게임서버 새로 짜는 멀티스레드 프로그램 |
게임에서 멀티스레드 사례(1) - 서버 클라이언트 구조
여기 다중 접속을 지원하는 게임이 있다. 싱글 스레드의 경우 한 클라이언트가 서버에 요청한 일을 수행하는 동안 다른 클라이언트가 요청한 일을 수행하지 못해 멈추게 된다. 멀티스레드는 클라이언트에서 요청한 일을 병렬적으로 수행함으로 이 문제를 해결한다.
게임에서 멀티스레드 사례(2) - 던파 클라이언트의 멀티스레드 구조
기존에 싱글스레드로 짜인 게임으로 Heterogeneous 멀티스레드 스타일을 적용하여 총 4개의 스레드로 구성되어있다.
다음은 던파 클라이언트를 구성하는 주 스레드다.
- Render Thread
- Load Thread
- Key Input Thread
- Network Thread
게임에서 멀티스레드 사례(3) - UE4의 멀티스레드 구조
Heterogeneous 멀티스레드 스타일을 적용한 총 3개의 주 스레드와 많은 개수의 Worker 스레드로 구성되어있다.
다음은 UE4를 구성하는 주 스레드다.
- Game Thread
- Render Thread
- Audio Thread
UE4의 멀티스레드 성능은 4코어까지가 한계로 그 보다 높은 코어수에서는 병목현상으로 인해 성능 향상을 기대하기 어렵다.