C# 서버

멀티쓰레드 프로그래밍

영춘권의달인 2024. 4. 28. 21:30

멀티쓰레드란?

쓰레드란 프로세스(프로그램)에서 실행되는 흐름의 단위이다.

보통 알고리즘 문제를 풀거나 유니티 로직을 짤때 별도의 쓰레드를 생성하지 않았고, 그렇다면 기본적으로 하나의 쓰레드가 존재한다.

이렇게 하나의 쓰레드가 하나의 프로세스에 있는 것을 싱글쓰레드 라고 하고, 여러개의 쓰레드가 하나의 프로세스에 있는 것을 멀티쓰레드라고 한다.

 

스레드는 그냥 실행되는것이 아니라 실행하는데 필요한 자원이 필요하다.

즉, 프로세서(CPU코어)가 스레드를 실행해줘야 하고, 프로세서는 한번에 하나의 쓰레드만 실행시킬 수 있다.

프로세스가 실행되는 과정은 프로세서가 엄청나게 빠른 시간 간격으로 쓰레드들에 할당되어 쓰레드를 실행해주는 것이다. 코어가 할당되는 속도가 매우 빠르다보니 동시에 실행되는것처럼 보이는 것이다.

 

프로세서가 어떤 쓰레드에 할당될지는 커널 영역에서 프로세스 스케쥴링에 의해 정해진다.

프로세서가 쓰레드들에 차례로 할당되는 것이 아니라 특정 스케쥴링 기법에 의해서 할당되기 때문에 어떤 경우에서는 프로세스가 프로세서를 계속해서 할당받지 못하는 경우가 발생할 수 있고, 이것을 기아(Starvation)현상이라고 한다.

 

쓰레드를 적당히 늘려서 멀티쓰레드로 일감을 나누어 효율적으로 실행되게 하는것은 좋지만 무작정 쓰레드를 늘리는것은 좋지 않은 방법이다. 왜냐하면 프로세서가 스레드를 옮겨다니는 것은 사실 상당히 무거운 작업이기 때문이다. 이것을 Context Switching이라고 하는데, 뒤에서 다루도록 하겠다.

 

하나의 프로세스에 있는 쓰레드들은 Heap영역과 데이터 영역을 공유해서 사용하고, 각자의 개인적인 스택 영역을 가진다.

멀티쓰레드 환경에서 스택 영역을 접근하는것은 아무런 문제가 없지만 공유해서 사용하는 영역에 접근하는 것은 문제가 발생할 수 있다.

멀티쓰레드의 이론과 현실

또한, 하나의 일감에 여러개의 쓰레드가 몰릴 경우와 같은 상황에서에는 싱글쓰레드가 더 좋은 성능을 내는 경우가 있을수도 있다.

멀티쓰레드로 프로그래밍을 할때는 이런 부분들에 대해 잘 생각하고 관리해야 한다.

 

'C# 서버' 카테고리의 다른 글

게임 입장  (0) 2024.05.04
서버 - Unity클라 통신 테스트  (0) 2024.05.03
Lock  (0) 2024.04.29
Race Condition(경합 조건), Atomic(원자성)  (0) 2024.04.29
캐시  (1) 2024.04.28