[게임 서버] 1.4 스레드 정체

업데이트:     Updated:

카테고리:

태그:

이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 GPT에게 요약을 요청하여 작성되었습니다.
게임 서버 프로그래밍 교과서, 배현직 저자

📦 1. 멀티스레딩

👉🏻 4. 스레드 정체

📌 컨텍스트 스위치 (Context Switch)

각 스레드를 실행하다 말고 다른 스레드를 실행하는 과정

컨텍스트 스위치가 발생하면 많은 연산이 발생한다.

너무 많이 발생하면? → 과도한 연산 너무 적게 발생하면? → 프레임이 끊기고 답답함

그래서 가급적이면 쾌적한 정도로 조절해야 한다.


💡 어떻게 작동하냐면?

  1. 실행 중이던 스레드의 상태(호출 스택 등)를 어딘가 저장
  2. 과거에 실행하다 만 다른 스레드 중 하나를 고름
  3. 그 스레드의 상태(호출 스택 등)를 복원
  4. 그 스레드가 실행하던 지점으로 강제 이동하여 실행

⏱ 타임 슬라이스 (Time Slice)

컨텍스트 스위치가 발생하는 시간 단위


🧠 컨텍스트 스위치와 CPU, 스레드 관계

상황 컨텍스트 스위치
CPU 개수 ≥ 스레드 개수 ❌ 발생하지 않음
CPU 개수 < 스레드 개수 ✅ 발생함

즉, Runnable 상태의 스레드가 CPU보다 많으면 문제가 생긴다. 하지만 Waitable 상태의 스레드는 문제가 되지 않는다.

→ 프로그램 스레드가 아무리 많아도 실제로 돌아가려는(Runnable) 스레드 개수만 CPU보다 적으면 문제 없음


🧨 문제는 언제 발생하냐?

프로그램이 어느 정도 실행된 후에 컨텍스트 스위치가 발생하는 타이밍이 중요하다.

C++ 코드 한 줄이라고 해서 원자적으로 실행되는 게 아니다.


🧬 예시

🔤 C 언어 코드

b = a * 2;

⚙️ 실제 기계어로 컴파일되면?

1. ...
2. r1 = a
3. r2 = r1 * 2
4. b = r2
5. ...

→ 이 중간에 컨텍스트 스위치가 발생할 수도 있음

예를 들어, r2 = r1 * 2까지만 하고, 다른 스레드로 넘어갔다가 다시 돌아와서 b = r2가 실행되는 식

그러므로 한 줄 코드도 완전한 연산 단위가 아니다.


정리하자면, 멀티스레딩에서는 컨텍스트 스위치의 타이밍과 빈도가 성능과 안정성에 영향을 준다.

그래서 스레드를 많이 돌릴 땐, 실제로 동시에 돌아가야 하는 스레드가 얼마나 되는지 잘 고려해서 짜야 한다.

GameServer 카테고리 내 다른 글 보러가기

댓글남기기