공부/인프런 - Rookiss

Part 4-2-1. 멀티쓰레드 프로그래밍 : 멀티쓰레드 개론

셩잇님 2023. 9. 4. 13:23
반응형

 

 

멀티 쓰레드

서버는 멀티쓰레드를 활용한다.

 

여태까지 자료구조와 알고리즘은 기초 지식이 없어도 충분히 이해하고 활용할 수 있지만, 멀티쓰레드부터는 원할한 이해를 위해선 컴퓨터 구조 원리와 운영체제의 기본 지식이 필요하다. 따라서 오늘은 당장 코드로 이런, 저런 작업을 하는 것이 아닌 멀티쓰레드 개론에 대해서 얘기한다.

 


 

서버를 운영하는 것은 식당을 운영하는 것과 같다.

 

 

 우리가 크게 한식, 일식, 그리고 이보다 규모가 조금 큰 패밀리 레스토랑 총 3가지의 식당을 운영한다고 가정해보자. 로봇 직원은 혼자서 아무것도 하지 못하는 상황이며, 식당 관리자인 우리는 영혼을 각 식당의 로봇에게 부여한다고 한다. 이 때 영혼도 1개라고 가정한다.

 

 그렇다면 영혼이 1개인데 각 식당의 로봇을 어떻게 관리하고 일을 시킬수 있을까?

👉 이는 가게의 모든 로봇을 순차적으로 0.01초 만큼 동작하게 하고 로봇은 그 시간동안 행동한다. 그렇지만 아무것도 모르는 손님 시점에서는 모든 로봇이 정상적으로 움직이게 보이는 것이다. 즉. 동시에 모든 로봇이 정상적으로 일을 하는 것 처럼 보이지만, 사실 관리자인 내가 영혼을 통해 한식 로봇, 일식 로봇 등을 왔다갔다 옮겨 다니며 일을 부여하는 것이다.

 

 

 자. 그렇다면 이제 식당이 아닌 컴퓨터 관점으로 다시 이미지를 보자. 우리가 식당으로 생각했던 것들은 사실 그림판, 메모장, MMO 서버로 대칭된다. 또한 로봇은 쓰레드가 되며, 영혼은 CPU의 코어로 치환된다.

 

 따라서 위에 설명한 것과 같이 단일 쓰레드 (=1개의 CPU 코어)는 그림판과, 메모장, MMO를 모두 옮겨다니며 일을 하지만, 사용자 입장에서는 컴퓨터가 동시에 실행되고 있는 것처럼 보이는 것이다. 

 

 또한 어떤 프로그램을 실행할까? 결정하는 것이 바로 스케줄링의 개념이다. 스케줄링은 정보처리기사때 학습한 내용인데, 이 개념이 멀티쓰레드 나온다니 반갑다. 😎 

 

 이 때 그림판과, 메모장은 하찮은 프로그램이고 MMO 서버는 중요한 프로그램이라고 가정해본다면 스케줄링을 실행할 때 우선순위를 정할 수 있다. (스케줄링 우선순위) 즉. 모든 프로그램들이 다 똑같은 시간만큼 실행해야 한다는 조건은 없는 것이다. 그래서 MMO 서버에 스케줄링을 몰빵할 경우 기아 현상이 나타난다.

 


 

다중(=멀티) 코어가 된다면?

 즉 영혼이 2, 4, 8개가 되는 것이다. 그렇지만 영혼이 늘어났다고 해서 쓰레드(직원)을 무작정 늘린다면 성능이 좋아지는 것은 아니다. 왜냐하면 A 쓰레드(직원)에서 B 쓰레드(직원)로 옮겨가는 과정은 매우 무겁고 힘든 직업이다. 따라서 쓰레드(직원)을 늘린다고 성능이 좋아지는 법은 없다. 오히려 가장 이상적인 상황은 코어 수에 맞게 쓰레드를 실행하는 것이다.

 

 그렇다면 쓰레드(직원)을 사용하는 것은 좋은데, 어떻게 사용해야 잘 사용했다고 소문이 날까?

👉 쓰레드(직원)의 담당 부서를 정하고 나누는 것이다.

1. 게임 로직을 담당하는 쓰레드.

2. 클라이언트 세션을 담당하는 쓰레드

3. DB를 담당하는 쓰레드

 

 그렇지만 쓰레드는 힙 영역과 데이터 영역은 모든 쓰레드들이 공유해서 사용하고, 스택은 자신만의 고유한 공간을 할당 받는다. 즉 여러 직원이 있는 환경에서 개개인의 쓰레드의 스택에 접근하는 것은 문제가 없지만, 동ㅅ에 공용으로 사용하는 힙 영역을 사용하는 것은 문제가 된다.

 

쓰레드의 힙 영역, 스택 영역을 알려주는 이미지 😁

 

 왜 문제가 생길까? 담당 부서를 정해서 일을 분배하려고 쓰레드를 생성하여 둔 것인데 이놈들이 서로 얽혀서 누구나 편한 계산대만 담당하려고 하는 것이다. 따라서 쓰레드를 관리하는 것은 굉장한 이점이지만, 정상적으로 관리하지 못한다면 쓰레드가 하나만 있는 것만 못하다.

 

쓰레드의 이상적인 일 분배와 그렇지 못한 현실

 

 

 

반응형