멀티쓰레드 입문

Jaemyeong Lee·2024년 12월 6일
0

1. 멀티스레드란?

멀티스레드는 프로그램의 작업을 여러 스레드로 나누어 동시에 수행하는 기법입니다. 이는 프로그램이 더 많은 작업을 병렬로 처리할 수 있도록 설계되어 성능을 극대화할 수 있습니다.


Rookiss의 고급식당

고급 레스토랑에 직원과 영혼이 있다.
식당에는 한식, 일식, 패밀리 레스토랑이 있고 직원을 고용해서 운영한다.
직원이 비싸다고 가정한다. 영혼이라는 존재가 있어 영혼을 주입시킨 존재만 일을 할 수 있다.
한식에 갔으면 한식 직원만 움직이고 일식, 패밀리 레스토랑은 멈춰있다.
각각 빠르게 스위치 해줘서 동시에 움직이는 것처럼 보이게 한다.

식당 - 프로세스(프로그램)
직원 - 스레드
영혼 - CPU 코어

현재 컴퓨터는 여러가지 프로그램을 동시에 열 수 있지만
옛날에는 아님 동작시키는것이 쓰레드를 배치시켜 프로그램을 구동시키는것

그림판 , 메모장, MMO 서버 동시에 실행
운영체제 커널 모드에서 CPU, 프로세서를 통해 여러가지 프로그램을 동시에 실행
멀티 코어로 감 운영체제가 담당함

CPU에 여러개의 코어가 있고 프로세서가 담당함

why mmo에서 멀티스레드 필요
너무 할일이 많다.

멀티 쓰레딩의 무서운점
Heap영역을 공유함

프로세스가 옮기는데 비용이 있다.

컨텍스트 스위칭이 발생한다.

처리할 수 없을 경우 인위적으로 잠들고 다시 살리는 작업등을 할것이다.

즉 일의 분배를 하는것이 어렵다

2. 스레드와 프로세스의 차이

2.1 프로세스란?

  • 정의: 실행 중인 프로그램을 의미합니다. 프로세스는 독립적인 실행 단위를 가지며 자체적인 메모리 공간을 사용합니다.
  • 특징:
    • 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 사용.
    • 하나의 프로세스는 하나 이상의 스레드를 포함할 수 있음.
    • 생성과 종료 시 높은 비용이 발생.

2.2 스레드란?

  • 정의: 프로세스 내에서 실행되는 가장 작은 실행 단위.
  • 특징:
    • 스레드는 프로세스 내의 코드, 데이터, 힙 영역을 공유하지만 스택 영역은 개별적으로 소유.
    • 생성과 종료가 프로세스보다 비용이 적음.
    • 같은 프로세스 내에서 다른 스레드와 자원을 공유하므로 더 빠른 데이터 전달 가능.

3. 프로세스와 스레드의 비교

구분프로세스스레드
정의실행 중인 프로그램프로세스 내의 실행 단위
메모리 공유독립된 메모리 공간 사용힙과 데이터 영역을 공유
실행 단위독립적으로 실행프로세스 내에서 실행
비용생성과 종료에 높은 비용이 듦생성과 종료 비용이 낮음
예시게임 애플리케이션게임 로직, 네트워크 처리, DB 작업

4. CPU와 스레드의 관계

4.1 CPU와 코어

  • CPU는 코어라는 실행 유닛을 가지고 있으며, 코어는 하나의 스레드를 실행할 수 있습니다.
  • 싱글코어 CPU: 한 번에 하나의 스레드만 실행 가능.
  • 멀티코어 CPU: 여러 스레드를 동시에 실행할 수 있어 병렬 처리가 가능.

4.2 코어와 멀티스레드

CPU 코어 | 실행 중인 스레드
---------|-----------------
코어 1   | 스레드 A
코어 2   | 스레드 B
코어 3   | 스레드 C
코어 4   | 스레드 D
  • 멀티코어 CPU는 스레드 분배를 통해 여러 작업을 동시에 처리할 수 있음.
  • 단, CPU 코어의 수보다 많은 스레드가 실행 중이라면 스레드 간의 컨텍스트 스위칭이 발생.

5. 컨텍스트 스위칭

5.1 컨텍스트 스위칭이란?

  • 정의: CPU가 실행 중인 스레드(또는 프로세스)를 다른 스레드로 전환하는 과정.
  • 과정:
    1. 현재 실행 중인 스레드의 상태 저장 (레지스터, 프로그램 카운터 등).
    2. 다음에 실행할 스레드의 상태를 복원.
    3. CPU 실행 제어를 전환.

5.2 컨텍스트 스위칭의 시각적 이해

시간 ->
| 스레드 A 실행 | 스레드 B 실행 | 스레드 A 실행 | 스레드 B 실행 |
|---------------|---------------|---------------|---------------|
  • CPU는 짧은 시간 동안 빠르게 스레드를 전환하며 동시에 실행되는 것처럼 보이게 만듦.

5.3 컨텍스트 스위칭의 비용

  • 장점:
    • 여러 작업을 빠르게 전환하여 동시성 제공.
  • 단점:
    • 상태 저장/복원, 캐시 무효화 등의 작업으로 인해 성능 저하 발생.

6. 멀티스레드의 이점과 도전 과제

6.1 멀티스레드의 이점

  1. 동시성 향상: 여러 작업을 동시에 수행하여 응답성과 효율성 증가.
  2. 응답성 개선: 사용자 인터페이스(UI)와 같이 높은 응답성을 요구하는 작업에서 유리.
  3. 리소스 활용 극대화: 멀티코어 CPU의 성능을 최대로 활용 가능.

6.2 멀티스레드의 도전 과제

  1. 동기화 문제:
    • 공유 자원(예: 힙, 데이터)에 접근 시 동기화 문제 발생 가능.
    • 해결 방법: Mutex(뮤텍스), Semaphore(세마포어), Lock 등의 동기화 도구 사용.
  2. 디버깅의 복잡성:
    • 스레드가 비동기적으로 실행되므로 문제를 재현하거나 디버깅하기 어려움.
  3. 컨텍스트 스위칭 비용:
    • 너무 많은 스레드가 실행될 경우 컨텍스트 스위칭 비용 증가로 성능 저하.
  4. 자원 관리:
    • 지나치게 많은 스레드는 메모리와 CPU 자원을 낭비할 수 있음.

7. MMORPG에서 멀티스레드의 필요성

7.1 MMORPG 특징

  • 많은 동시 접속 사용자가 서버와 상호작용.
  • 서버는 다음과 같은 작업을 동시에 처리해야 함:
    • 게임 로직 처리: NPC 이동, 몬스터 공격 등.
    • 네트워크 세션 관리: 클라이언트와의 통신.
    • 데이터베이스 연동: 사용자 정보 저장/불러오기.

7.2 멀티스레드 사용 이유

  • 각 작업을 스레드로 분리하여 병렬 처리.
  • 예시:
    게임 로직 스레드 | DB 처리 스레드 | 네트워크 스레드
    -----------------|---------------|----------------
  • 클라이언트 세션마다 스레드를 할당하여 응답 속도를 향상.

8. 게임에서 멀티스레드 활용의 한계

8.1 스레드가 많다고 좋은 것은 아님

  • 공유 자원 문제:
    • 모든 스레드가 힙과 데이터 영역을 공유하므로 동기화 문제 발생 가능.
    • 예시: 두 스레드가 동시에 데이터를 읽고 쓰는 경우 데이터 손상 위험.
  • 스레드 경쟁 문제:
    • CPU 자원을 과도하게 사용하거나 비효율적으로 사용하면 성능 저하.

8.2 스레드 비용

  • 스레드를 전환하는 과정에서 발생하는 비용은 CPU 성능에 영향을 미침.
  • 해결책:
    • 규모가 작은 작업: 만능 스레드 사용.
    • 규모가 큰 작업: 전문 스레드로 분리.

profile
李家네_공부방

0개의 댓글