[게임 서버] 6.9 스레드 모델
카테고리: GameServer
태그: GameServer
📦 6. 게임 네트워크 엔진 프라우드넷
👉🏻 9. 스레드 모델
🔀 두 가지 방식
멀티스레드 방식:
┌────────────┐
│ Process 1 │
│ - Thread 1 │
│ - Thread 2 │
│ - Thread 3 │
│ - Thread 4 │
└────────────┘
멀티프로세스 방식:
┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐
│ Process 1 │ │ Process 2 │ │ Process 3 │ │ Process 4 │
│ Thread 1 │ │ Thread 1 │ │ Thread 1 │ │ Thread 1 │
└───────┘ └───────┘ └───────┘ └───────┘
프라우드넷의 지원:
- 프라우드넷은 위 두 모델을 모두 지원한다
- 기본적으로 NetServer의 워커 스레드는 CPU 개수만큼 구동 (멀티스레드 방식)
⚠️ 멀티스레드 방식을 권장하지 않는 경우
1. 서버 내부 데이터가 뮤텍스 1개로 보호:
- 스레드가 많더라도 한 번에 하나만 실행이 가능함
- 멀티스레드 이점이 없으며, Context Switching 비용만 증가함
2. 서버 내부 로직에서 DB나 파일 액세스 등 디바이스 타임이 없음:
- 전부 CPU 계산만 한다면 멀티스레드가 필요 없음
3. 서버 프로세스를 여러 개 띄울 수 있게 분산 서버로 개발:
- 서버 프로세스를 분산해서 부하를 나누는 게 더 좋다
🖥️ 멀티프로세스 방식
개념:
- 워커 스레드를 1개로 설정하고 CPU 개수만큼 서버를 구동한다
구현:
void main() {
...
CThreadPool* p = CThreadPool::Create(..., 0); // 1
CStartServerParameter param;
...
param.m_externalNetWorkerThreadPool = p; // 2
param.m_externalUserWorkerThreadPool = p;
netServer->Start(param);
while(true) {
...
// 3
p->Process(10);
}
}
설명:
- 1번: 스레드가 없는 스레드 풀 객체를 생성한다
- 2번: NetServer가 해당 스레드 풀 객체를 사용하도록 설정한다
- 3번: 수동으로 스레드 풀을 작동하도록 하는 함수를 호출한다
- 최대 10ms까지 기다리며, thread pool에 쌓인 이벤트 처리
🧐 정리
| 방식 | 장점 | 단점 | 적합한 경우 |
|---|---|---|---|
| 멀티스레드 | 구현 간단 동시 처리 |
Context Switching 동기화 복잡 |
I/O 대기 많음 다양한 뮤텍스 |
| 멀티프로세스 | 독립적 실행 장애 격리 |
프로세스 간 통신 필요 | CPU 계산 위주 단일 뮤텍스 |
선택 기준:
- I/O 대기가 많고 데이터 보호가 세분화: 멀티스레드
- CPU 계산 위주이거나 전역 뮤텍스 사용: 멀티프로세스
댓글남기기