[Networking] 01 멀티 스레딩

해당 포스팅은 배현직님의 [게임 서버 프로그래밍 교과서] 책의 내용을 바탕으로 작성되었습니다.

1.1 프로그램과 프로세스

프로그램(Program)이란 컴퓨터에서 실행되는 명령어 모음이다. 크게 코드와 데이터로 구성되어 있다.

프로그램을 실행하면 프로그램 안에 들어있는 명령어가 한 줄씩 실행되면서 활동을 하는 상태가 된다. 이를 프로세스(Process)라고 한다.

프로그램에 있는 코드와 데이터는 이 프로세스 메모리로 로딩된다.

이때 프로세스가 여러 개 실행되는 것을 멀티프로세싱(Multi Processing)이라고 한다.


1.2 스레드

각각의 프로세스에는 독립된 메모리 공간을 가지고 있다. 기본적으로 서로 다른 프로세스는 상대방의 메모리 공간을 읽고 쓸 수 없다.

일반적으로 운영체제에서는 스레드(Thread)라는 기능을 제공한다. 스레드 역시 프로세스처럼 명령어를 실행하지만, 프로세스와 스레드간의 차이점은 다음과 같다.

 1. 스레드는 한 프로세스 안에 여러 개 만들 수 있다.
 2. 한 프로세스 안에 같이 존재하는 스레드는 프로세스의 메모리 공간을 같이 사용할 수 있다.
 3. 스레드마다 스택을 가진다.

프로그램을 실행하면 프로세스가 생성되고, 프로세스 안에는 스레드가 존재하며 그 안에서 프로그램이 실행된다.

이때 하나의 스레드만 실행되는 프로그램을 싱글 스레드 모델(Single threaded Model)이라고 부르며, 여러 스레드가 동시에 여러 가지 일을 처리하게 하는 것을 멀티 스레드 모델(Multi threaded Model)이라고 한다.


1.3 멀티스레드 프로그래밍이 필요한 경우

멀티스레드 프로그래밍을 적절히 사용하면 굉장히 많은 작업을 효율적으로 처리할 수 있다. 하지만 잘못 사용하면 오히려 연산이 느려지거나 심각한 경우, 프로그램에 심각한 문제를 일으킬 수도 있다.

따라서 멀티스레드 프로그래밍이 어떠한 상황에서 어떻게 사용해야 좋은가를 파악하고 있어야한다.

다음은 멀티스레드 프로그래밍이 유용한 몇 가지 대표적인 예시들이다.

1. 어떤 긴 작업을 처리하는 동안 짧은 작업을 할 때.
2. 하드웨어의 성능을 최대한 효율적으로 사용해야 할 때.

아마 다들 게임을 하다보면 게임의 로딩 화면을 본 적이 있을 것이다.

게임에서 캐릭터나 맵을 불러올 때, 매우 많은 양의 데이터를 읽어와야한다. 이 작업을 처리하는 동안 게이머들이 지루하지 않게 게임에서는 로딩 화면이나 간단한 애니메이션 등을 이용하여 이를 처리한다.

또한 멀티스레드 프로그래밍은 하드웨어의 성능을 온전히 활용해야 할 때에도 사용할 수 있다. 만약 우리가 사용하고 있는 컴퓨터에 8코어 CPU가 장착되어 있는데, 정작 싱글스레드로 하나의 코어만 이용한다면 하드웨어의 성능을 온전히 사용하고 있다고 말하기 어려울 것이다.