[게임 서버] 6.9 스레드 모델

게시:     수정

카테고리:

태그:

📦 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 계산 위주이거나 전역 뮤텍스 사용: 멀티프로세스

GameServer 카테고리 내 다른 글 보러가기

댓글남기기