게임 서버에서 가장 중요한 것

  • 안정성
  • 성능

성능을 높이려면?

  • 프로그램 최적화
  • 멀티코어 활용

멀티코어를 활용하려면

  • 멀티쓰레드 프로그래밍이 필요

온라인 게임을 만들려면?

  • 소켓 프로그래밍 필요

다중 접속 서버를 만들려면?

  • 서버에서 동접과 같은 수의 소켓을 관리하여야 한다

효율적인 다중 접속 관리는?

  • IOCP가 필수  -> IOCP는 멀티쓰레드 프로그래밍을 요구한다.

 

프로세스와 쓰레드

프로세스 :  실행 중인 프로그램

쓰레드    :  프로그램(프로세스) 실행의 흐름 -> 프로세스 실행 중 프로그램이 쓰레드 생성 명령 실행 

 

 

프로세스는 실행 중인 프로그램을 프로세스라고 한다. 스레드는 프로세스의 안에 있는 것이다. 멀티스레드 프로그래밍을
하지 않아도 스레드 1개는 있다(메인부터 해서 끝날때까지의 흐름). 

 

병렬처리

  • 하나의 작업을 여러 개의 context에서 수행하는 것( context == CPU의 실행 상태 )

하나의 프로그램이 병렬로 실행된다. 그 단위를 context라고 정의한다. context가 여러개 있다는 것은
여러 개의 cpu가 동시에 실행한다는 뜻이다. cpu의 실행 상태는 context이고, cpu가 한 개 있을 때 여러 개의
프로세스를 실행한다는 것은 하나의 cpu가 옮겨가면서 프로세스들을 실행한다는 뜻이다. 그렇기 때문에
실행 상태를 저장해야 하고 그걸 context라고 한다. 이 저장은 PCB에 저장된다. 프로세스에 여러개의 context가
있는 게 병렬 컴퓨터이다.

 

병렬처리를 하는 이유는?

  • 한 개의 CPU의 처리 속도가 너무 느리기 때문

예전에는 1G CPU 팔다가 2G CPU 팔면서 2배 빠른 컴퓨터를 사라고 홍보했지만 이제는 안된다. 지금 나오는 CPU
클럭은 3G 정도다. 2002년에 CPU가 2.4G가 있었으니까 지금 CPU와 클럭 속도의 차이가 얼마 안 난다. 그렇기 때문에
싱글코어 CPU의 성능 차이는 거의 없다. 그러면 CPU 만드는 회사들이 망할까? 아니다. 그래서 나온게 바로 멀티코어다.
싱글 코어 팔다가 듀얼 코어 팔면서 2배 빠르다고, 그리고 쿼드코어 팔면서 4배 빠르다고, 이제는 코어 개수로 승부한다.

 

프로세스

프로세스는 PCB라는 자료구조가 있다. 이건 커널이 관리하는 자료구조로 우리가 읽고 쓸 수 없는데, 여기엔 프로세스
실행에 필요한 여러 데이터가 있는데 그 중 context가 있다. 스택 포인터(SP)가 어디까지 와 있는가는 레지스터에 있고,
지금 코드에 어느 명령어가 실행 되는가는 프로그램 카운터(PC)에 들어 있다.

 

그래서 실행 중인 프로세스는 context가 CPU 안에 들어 있다. CPU 안에 있는 레지스터가 쭉 사용되다가 프로그램이
스위칭 되면 CPU 안에 있는 레지스터 내용을 context에 저장하고 다른 프로세스를 실행한다.

 

 

멀티스레드

  • 하나의 프로그램의 여러 곳이 동시 다발적으로 실행되는 프로그래밍 기법
  • 최근에 가장 많이 사용되는 병렬처리 프로그래밍 기법
  • 하나의 프로세스에서 여러개의 실행 흐름을 만들어주는 것
  • 하나의 쓰레드는 한번에 하나의 일만 할 수 있다. 멀티쓰레드란 여러 개의 쓰레드로 동시에
    여러개의 쓰레드를 사용해
    여러 개의 일을 하는 것이다.

프로세스 안에 스레드가 여러 개 존재할 수 있다. 그리고 스레드마다 TCB를 가진다. 각자 컨트롤 블록마다 context를
따로 가지고 있다. 

 

 

멀티쓰레드의 장단점

장점

  • 성능 향상
  • 빠른 응답속도
  • 더 나은 자원 활용 ( CPU Core )
  • 프로세스보다 효율적인 통신 ( 메모리 읽고 쓰기, context switching )

멀티스레드 프로그래밍을 하지 않으면 쿼드 코어인 경우 3개의 코어는 놀고 있다. 
데이터를 주고받을 때도 프로세스끼리 데이터를 주고받는 것보다 스레드끼리 주고받는게 훨씬 빠르다.
context switching을 프로세스간에 하는 것보다 스레드간에 하는 것이 더 오버헤드가 적다.

 

단점

  • 프로그램 복잡도 증가
  • 디버깅의 어려움 ( data race, deadlock )

 

게임 서버에서 멀티 쓰레드를 사용하는 이유

게임 서버에서의 성능은 동접이다. 한 프로그램에서 동접을 최대한 많이 받기 위해 멀티쓰레드를 쓰는 것이다.
게임 서버는 많은 처리를 해야 하는데 해야할 일의 길이가 차이가 있다. 어떤 일은 1초, 어떤 일은 1/10000초만에
작업을 한다. 작업들이 쌓이면 cpu가 처리해야 하는데, 싱글스레드 프로그램일 때 1초짜리 일이 날라오면 1초동안
다른 동작들은 다 멈춰버린다. 1초의 딜레이가 생기는 것이다. 하지만 멀티스레드는 어떤 스레드가 1초동안 어떤 작업을
하느라 묶여 있더라도, 다른 스레드가 다른 작업을 처리하면 된다. 그래서 응답 속도를 높일 수 있다.

 

 

멀티스레드 프로그래밍 주의할 점

  • 쓰레드의 개수가 많다고 좋은 것은 아니다.
  • 코어의 개수에 맞추어라
  • 운영체제 및 하드웨어에 부담

쓰레드의 개수가 多 -> 스택에 차지하는 메모리 多 -> PCB 안에 TCB가 多
-> context 일어날 때 비교할 게 多 -> 운영체제 부담 ↑

 

아무리 개수가 많아도 코어의 개수만큼만 돌아가고 나머지는 waiting하고 있다. -> 코어의 개수에 맞춰서 돌려야 함!!

예를 들어 쿼드코어라면 스레드를 4개 만드는게 제일 성능에 좋다. 8개 만들면 오히려 context switch overhead 때문에
느려진다.

 

 

 

+ Recent posts