본문 바로가기

Game Server

[서버] 멀티스레드

멀티스레드는 서버 입장에서는 필수적인 요소임. 문제는 멀티스레드 프로그래밍을 하는 순간부터 굉장히 많은 문제가 생김. 

 

예로 들어 내가 타이쿤 게임을 한다고 가정하자. 그리고 한식, 일식, 그리고 좀 규모가 큰 패밀리 레스토랑이 있고, 각각 1,1,2명의 직원이 있다, 그리고 내 손은 하나고 이 직원을 한 번에 한 손으로 한 번씩 명령을 내릴 수 있다. 물론 손 빠른 사람은 이런 직원들을 마치 손이 4개인 것 처럼 움직일 수 있겠지만 만약 한 식당이 바쁘다면 다른 직원들이 관리가 되지 않을 것이다. 

 

컴퓨터도 마찬가지이다. 다양한 프로그램을 실행하면서 그 안에서 다양한 일이 일어나게 되는데, 메모리에 올라갔다고 해서 실행되는 것이 아니라, CPU가 CPU 코어(프로세서, 손)에 각 프로세스(각 식당)의 스레드(직원)로 들어가서  굉장히 빠른 속도로 돌아가며 실행하는 것이라고 보면 된다. 즉 단일 코어는 결국 굉장히 많은 일을 해야한다면, 결국 다른 일이 처리가 안 된다는 문제점이 발생한다는 점이다.

 

그래서 멀티스레드 환경을 만들 때 이런 코어의 수가 적다면 결국 성능이 많이 향상되진 않는다. 다시 위의 타이쿤의 예시로 돌아가면 각 프로그램의 스레드는 1, 1, 2개씩 배치가 되어있고, 이에 제일 최상의 성능을 내기 위해서는 CPU 코어가 4개가 있다면 최고의 성능이 나올 것이다. (즉 게임 내 직원이 4명이고 내 손이 4개면 다 커버할 수 있으니까!)

 

게임 서버로 간다면 게임 로직을 담당하는 스레드, DB를 담당하는 스레드, 클라이언트 세션을 유지해주는 스레드 이렇게 나눠서 처리하는 식으로 배치하면 동시 다발적으로 실행하게 하는 편으로 가는 것이 최종 목표가 될 것이다.

그럼 동일 프로그램을 켜는 것과 스레드를 여러 개를 배치하는 것과 다른 점이 무엇일까? 스레드는 자신만의 stack 공간 외적으로 모든 메모리를 공유한다. 하지만 이런 경우 동일한 메모리에 접근할 때 발생하는 문제 등과 같은 상황을 제대로 컨트롤하는 능력을 가지는 것이 중요하다. 이런 부분을 처리하지 못한다면 제대로 병렬적으로 처리 되지 않고, 엉망이 될 가능성이 높아진다!

'Game Server' 카테고리의 다른 글

[C++/서버] Lock-2  (0) 2022.07.07
[C++/서버] DeadLock  (0) 2022.07.07
[C++/서버] Lock  (0) 2022.07.07
[C++/서버] Atomic  (0) 2022.07.04
[서버] 스레드 생성  (0) 2022.07.04