[서버-1] 멀티스레드란 ?

#서버 프로그래밍

스레드 그리고 멀티스레드를 사용하는 이유


프로세스(Process)

디스크에 저장되어 있는 프로그램을 실행하면 프로세스가 된다. 하나의 프로그램을 여러 개 실행시키면 멀티프로세싱(multi-processing)이라고 한다.

여러 개의 프로세스는 각자의 메모리 공간을 가지고 서로의 메모리를 공유하지 않는다.

스레드(Thread)

스레드는 프로세스안에 존재한다. 한 프로세스 안에 있는 스레드는 프로세스 안에 있는 메모리 공간을 같이 사용할 수 있다. 이것이 멀티프로세싱멀티스레딩의 가장 큰 차이점이다.

멀티프로세스와 멀티스레드를 이용하면 하나의 프로그램에서 여러 가지 작업을 동시에 처리할 수 있다. 리눅스에서는 프로세스에서 또 다른 프로세스를 만들려면 C언어 기준fork() 함수를 사용하면 되고 스레드를 생성하려면 thread_create() 함수를 사용하면 된다.

그러나 대부분 멀티 작업 경우에서 멀티프로세싱보다 멀티스레딩을 더 선호한다. 그 이유는 크게 2가지이다.

  1. 스레드는 서로 메모리(자원)을 공유할 수 있다.
  2. 프로세스간의 Context Switch는 오버헤드가 크므로 멀티스레딩의 성능이 더 좋다.

그렇다면 멀티 작업은 주로 언제 쓰일까

멀티스레드를 언제 사용하나?

동시에 여러 가지 일을 한꺼번에 실행 해야 되는 경우는 언제일까? 대표적으로 3가지 상황이 존재한다.

  1. 오래 걸리는 일 하나와 빨리 끝나는 일 여럿을 같이 해야 할 때
  2. 어떤 긴 처리를 진행하는 동안 다른 짧은 일을 처리해야 할 때
  3. 기기에 있는 모든 CPU를 모두 활용해야 할 때

첫 번째 경우는 게임에서 스테이지에 들어가는 동안 로딩 창을 띄우는 경우에 해당한다. 스테이지에 들어가기 위해서는 캐릭터와 배경을 구성하는 그래픽 리소스를 로딩하고 많은 양의 데이터를 불러와야 하는데 이는 많은 시간이 걸려 이용자가 지루함을 느끼기 쉬우므로 로딩창을 배치하여 진행 상황과 애니메이션 등으로 지루함을 덜 수 있다.

두 번째 경우는 게임 서버에서 플레이어의 데이터를 I/O 할 때 다른 작업을 처리하는 것이다. 데이터 I/O는 기본적으로 디스크에 접근하므로 오버헤드가 크다. 이 시간을 무한정 대기하는 것은 낭비이므로 이 시간에도 다른 자잘한 요청들을 처리하는 것이다.

마지막으로 세 번째 경우다. CPU의 발전은 2000년 중반이후로 CPU의 클록 수(실행 속도)보다 코어 수를 늘리기에 집중하고 있다. 더이상 CPU의 클록 수를 늘리는 것은 기술적으로 어려움이 있다는 것이다. 늘어나는 코어에서 CPU의 자원을 100% 활용하기 위해서는 멀티스레드가 필요하다.

그 이유는 하나의 스레드는 하나의 코어를 사용한다. 만약 내가 8코어 CPU를 가지고 싱글스레드 프로그램을 돌린다면 하나의 코어만 쓰므로 전체 성능의 1/8만 사용하는 셈이다.

연산량이 많은 작업을 할 때 멀티스레드를 통해 CPU 코어들을 적극 활용하여 프로그램 성능을 높일 수 있다.