1. 멀티스레드란?
멀티스레드는 프로그램의 작업을 여러 스레드로 나누어 동시에 수행하는 기법입니다. 이는 프로그램이 더 많은 작업을 병렬로 처리할 수 있도록 설계되어 성능을 극대화할 수 있습니다.
Rookiss의 고급식당
고급 레스토랑에 직원과 영혼이 있다.
식당에는 한식, 일식, 패밀리 레스토랑이 있고 직원을 고용해서 운영한다.
직원이 비싸다고 가정한다. 영혼이라는 존재가 있어 영혼을 주입시킨 존재만 일을 할 수 있다.
한식에 갔으면 한식 직원만 움직이고 일식, 패밀리 레스토랑은 멈춰있다.
각각 빠르게 스위치 해줘서 동시에 움직이는 것처럼 보이게 한다.
식당 - 프로세스(프로그램)
직원 - 스레드
영혼 - CPU 코어
현재 컴퓨터는 여러가지 프로그램을 동시에 열 수 있지만
옛날에는 아님 동작시키는것이 쓰레드를 배치시켜 프로그램을 구동시키는것
그림판 , 메모장, MMO 서버 동시에 실행
운영체제 커널 모드에서 CPU, 프로세서를 통해 여러가지 프로그램을 동시에 실행
멀티 코어로 감 운영체제가 담당함
CPU에 여러개의 코어가 있고 프로세서가 담당함
why mmo에서 멀티스레드 필요
너무 할일이 많다.
멀티 쓰레딩의 무서운점
Heap영역을 공유함
프로세스가 옮기는데 비용이 있다.
컨텍스트 스위칭이 발생한다.
처리할 수 없을 경우 인위적으로 잠들고 다시 살리는 작업등을 할것이다.
즉 일의 분배를 하는것이 어렵다
2. 스레드와 프로세스의 차이
2.1 프로세스란?
- 정의: 실행 중인 프로그램을 의미합니다. 프로세스는 독립적인 실행 단위를 가지며 자체적인 메모리 공간을 사용합니다.
- 특징:
- 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 사용.
- 하나의 프로세스는 하나 이상의 스레드를 포함할 수 있음.
- 생성과 종료 시 높은 비용이 발생.
2.2 스레드란?
- 정의: 프로세스 내에서 실행되는 가장 작은 실행 단위.
- 특징:
- 스레드는 프로세스 내의 코드, 데이터, 힙 영역을 공유하지만 스택 영역은 개별적으로 소유.
- 생성과 종료가 프로세스보다 비용이 적음.
- 같은 프로세스 내에서 다른 스레드와 자원을 공유하므로 더 빠른 데이터 전달 가능.
3. 프로세스와 스레드의 비교
| 구분 | 프로세스 | 스레드 |
|---|
| 정의 | 실행 중인 프로그램 | 프로세스 내의 실행 단위 |
| 메모리 공유 | 독립된 메모리 공간 사용 | 힙과 데이터 영역을 공유 |
| 실행 단위 | 독립적으로 실행 | 프로세스 내에서 실행 |
| 비용 | 생성과 종료에 높은 비용이 듦 | 생성과 종료 비용이 낮음 |
| 예시 | 게임 애플리케이션 | 게임 로직, 네트워크 처리, DB 작업 |
4. CPU와 스레드의 관계
4.1 CPU와 코어
- CPU는 코어라는 실행 유닛을 가지고 있으며, 코어는 하나의 스레드를 실행할 수 있습니다.
- 싱글코어 CPU: 한 번에 하나의 스레드만 실행 가능.
- 멀티코어 CPU: 여러 스레드를 동시에 실행할 수 있어 병렬 처리가 가능.
4.2 코어와 멀티스레드
CPU 코어 | 실행 중인 스레드
---------|-----------------
코어 1 | 스레드 A
코어 2 | 스레드 B
코어 3 | 스레드 C
코어 4 | 스레드 D
- 멀티코어 CPU는 스레드 분배를 통해 여러 작업을 동시에 처리할 수 있음.
- 단, CPU 코어의 수보다 많은 스레드가 실행 중이라면 스레드 간의 컨텍스트 스위칭이 발생.
5. 컨텍스트 스위칭
5.1 컨텍스트 스위칭이란?
- 정의: CPU가 실행 중인 스레드(또는 프로세스)를 다른 스레드로 전환하는 과정.
- 과정:
- 현재 실행 중인 스레드의 상태 저장 (레지스터, 프로그램 카운터 등).
- 다음에 실행할 스레드의 상태를 복원.
- CPU 실행 제어를 전환.
5.2 컨텍스트 스위칭의 시각적 이해
시간 ->
| 스레드 A 실행 | 스레드 B 실행 | 스레드 A 실행 | 스레드 B 실행 |
|---------------|---------------|---------------|---------------|
- CPU는 짧은 시간 동안 빠르게 스레드를 전환하며 동시에 실행되는 것처럼 보이게 만듦.
5.3 컨텍스트 스위칭의 비용
- 장점:
- 단점:
- 상태 저장/복원, 캐시 무효화 등의 작업으로 인해 성능 저하 발생.
6. 멀티스레드의 이점과 도전 과제
6.1 멀티스레드의 이점
- 동시성 향상: 여러 작업을 동시에 수행하여 응답성과 효율성 증가.
- 응답성 개선: 사용자 인터페이스(UI)와 같이 높은 응답성을 요구하는 작업에서 유리.
- 리소스 활용 극대화: 멀티코어 CPU의 성능을 최대로 활용 가능.
6.2 멀티스레드의 도전 과제
- 동기화 문제:
- 공유 자원(예: 힙, 데이터)에 접근 시 동기화 문제 발생 가능.
- 해결 방법: Mutex(뮤텍스), Semaphore(세마포어), Lock 등의 동기화 도구 사용.
- 디버깅의 복잡성:
- 스레드가 비동기적으로 실행되므로 문제를 재현하거나 디버깅하기 어려움.
- 컨텍스트 스위칭 비용:
- 너무 많은 스레드가 실행될 경우 컨텍스트 스위칭 비용 증가로 성능 저하.
- 자원 관리:
- 지나치게 많은 스레드는 메모리와 CPU 자원을 낭비할 수 있음.
7. MMORPG에서 멀티스레드의 필요성
7.1 MMORPG 특징
- 많은 동시 접속 사용자가 서버와 상호작용.
- 서버는 다음과 같은 작업을 동시에 처리해야 함:
- 게임 로직 처리: NPC 이동, 몬스터 공격 등.
- 네트워크 세션 관리: 클라이언트와의 통신.
- 데이터베이스 연동: 사용자 정보 저장/불러오기.
7.2 멀티스레드 사용 이유
8. 게임에서 멀티스레드 활용의 한계
8.1 스레드가 많다고 좋은 것은 아님
- 공유 자원 문제:
- 모든 스레드가 힙과 데이터 영역을 공유하므로 동기화 문제 발생 가능.
- 예시: 두 스레드가 동시에 데이터를 읽고 쓰는 경우 데이터 손상 위험.
- 스레드 경쟁 문제:
- CPU 자원을 과도하게 사용하거나 비효율적으로 사용하면 성능 저하.
8.2 스레드 비용
- 스레드를 전환하는 과정에서 발생하는 비용은 CPU 성능에 영향을 미침.
- 해결책:
- 규모가 작은 작업: 만능 스레드 사용.
- 규모가 큰 작업: 전문 스레드로 분리.