CS/기타

멀티스레드 (Multi Thread)

_mwmw 2022. 8. 6. 03:51

스레드란?

스레드란 프로세스 내의 실행 흐름으로 프로세스보다 작은 단위다.

프로세스에서 제공하는 Protection Domain은 없다.

 

스레드가 나오게 된 배경

하나의 프로세스에는 하나의 Control만이 존재하기 때문에, 한 번에 하나의 일만 처리할 수 있다.

프로세스에서 할 작업을 여러 개로 쪼갠 뒤 각각을 스레드화하면 작업을 병렬적으로 처리할 수 있다.

 

Cooperative Process와의 비교

Cooperative Process는 IPC가 필요하기 때문에 비용이 많이 든다.

프로세스 내에서 Cooperate하는 스레드를 만든다면 보다 적은 비용으로 Cooperative Process가 하는 일을 동일하게 수행 가능하다.

 

프로세스와 스레드

프로세스간프로세스 간 메모리 영역은 독립적이므로 서로의 영역에 접근하기 어려우며 프로세스 간의 Switch 비용이 크다.

반면에 스레드는 하나의 프로세스안에 여러 개로 존재하여 프로세스의 메모리 영역은 스레드 간에 공유가 되므로 스레드 간의 Switch 비용이 적다.

 

스레드의 구성요소

Thread ID - 스레드 식별자

Program Counter - 현재 실행중인 Instruction의 주소

Register Set - CPU의 Register 값들

Stack

 

싱글스레드와 멀티스레드

 

멀티스레드 프로그램의 장점

  • 성능 향상 - 여러 스레드가 병렬적으로 작업을 수행
  • 응답성 향상 - 한 스레드가 오래 걸리거나 중단되어도 다른 스레드는 여전히 수행가능 

 

멀티스레드 프로그램의 주의점

  • 적당한 동기화 필요 - 과한 동기화는 성능 하락으로 이어지기 때문에 trade off를 잘 고려해서 구현해야 함
  • 스레드가 많다고 꼭 좋은것은 아님

 

두 가지의 멀티스레드 스타일

종류 Heterogeneous Homogeneous
작동 방식 역할에 따라 한 Thread는 한가지 일만 맡아 수행 역할 관계없이 작업이 생길 경우 아무 Thread로 수행
Job(Task | Worker thread) pool 
장점 구현이 쉬움
싱글→멀티스레드로 변환 쉬움
제한없는 병렬성 - CPU(코어) 수의 증가는 곧 성능 증가
단점 구현해놓은 스레드 이상으로는 성능향상 없음 이미 구현된 싱글스레드 프로그램을 변환하기 힘듬
추천 이미 싱글스레드로 짜여진 프로그램을 변환하는 경우 게임서버
새로 짜는 멀티스레드 프로그램

 

게임에서 멀티스레드 사례(1) - 서버 클라이언트 구조

여기 다중 접속을 지원하는 게임이 있다. 싱글 스레드의 경우 한 클라이언트가 서버에 요청한 일을 수행하는 동안 다른 클라이언트가 요청한 일을 수행하지 못해 멈추게 된다. 멀티스레드는 클라이언트에서 요청한 일을 병렬적으로 수행함으로 이 문제를 해결한다. 

 

게임에서 멀티스레드 사례(2) - 던파 클라이언트의 멀티스레드 구조

기존에 싱글스레드로 짜인 게임으로 Heterogeneous 멀티스레드 스타일을 적용하여 총 4개의 스레드로 구성되어있다.

다음은 던파 클라이언트를 구성하는 주 스레드다.

  • Render Thread
  • Load Thread
  • Key Input Thread
  • Network Thread

 

게임에서 멀티스레드 사례(3) - UE4의 멀티스레드 구조

Heterogeneous 멀티스레드 스타일을 적용한 총 3개의 주 스레드와 많은 개수의 Worker 스레드로 구성되어있다.

다음은 UE4를 구성하는 주 스레드다.

  • Game Thread
  • Render Thread
  • Audio Thread

UE4의 멀티스레드 성능은 4코어까지가 한계로 그 보다 높은 코어수에서는 병목현상으로 인해 성능 향상을 기대하기 어렵다.

 

참조

멀티스레드 - https://popcorntree.tistory.com/84

던파 멀티스레드 - https://blog.naver.com/intensive83/222797123259