일반적으로 하나의 Process는 하나의 Thread를 가지고 작업을 수행한다.
하지만, Multi Thread란 하나의 Process에서 다중의 Thread가 동시에 작업을 수행하는 것을 의미한다.
또한, Multi Process는 여러 개의 CPU를 사용하여 다중의 Process를 동시에 작업을 수행하는 것을 의미한다.

Multi Thread, Multi Process 모두 동시에 어떤 작업을 한다는 점이다.
여기서 둘의 차이는 독립적인 메모리 공간을 갖고 있느냐의 차이이다.
Multi Process는 각자 독립적인 메모리 공간을 갖지만, Multi Thread는 Thread가 상위 Process의 메모리 공간을 공유하여 사용한다.(Stack 메모리 공간은 예외)

이처럼 Multi Thread는 메모리 공간의 낭비가 적고 다수의 작업을 동시에 진행할 수 있다는 장점이 있다.


Context Switching

 

컴퓨터가 동시에 처리할 수 있는 최대 작업수는 CPU코어의 수와 같다.
그럼 CPU코어 보다 더 많은 Thread를 사용하게 되면 정해진 순서대로 작업을 번갈아가며 수행한다.

이렇게 각각의 Thread가 교체될 때, Thread 간의 Context Switching이라는 것이 발생한다.
현재 Thread의 작업을 하는 중에 다른 Thread의 작업을 하려면 현재 Thread의 작업을 저장하고, 다음 Thread를 불러오는 과정을 말한다.

이런 과정으로 알 수 있는 점은 무조건 Thread가 많다고 좋은 것이 아니라는 것이다.
저장과 불러오기의 과정에서 걸리는 시간이 커지게 되면 효율이 저하될 수밖에 없기 때문이다.


C#의 Thread Pool

 

사전에 일정 개수의 Thread를 만들어 놓고 작업 요청하게 되면, 사용가능한 Thread를 할당하여 수행하게 된다.
즉, 작업 요청 시에 Thread를 매번 만드는 것이 아니라 대기 중인 Thread를 불러서 작업을 요청하는 것이다.

그러면, Thread Pool의 최대 개수를 넘어선 작업을 요청하게 되면 작업은 점점 쌓이게 된다는 문제가 있다.
또한, Thread가 무한루프를 돌아도 문제가 생긴다.


이야기 예시

 

사장(CPU)과 알바관리 매니저(Process), 알바(Thread)가 하나의 가게를 맡았다고 하자. 끔찍하네

사장은 매니저에게 이것저것 시키게 된다.
매니저는 사장에게 들은 일거리를 알바에게 시킨다.
근데 알바는 일의 순서대로 차근차근 일을 하지만 몸이 하나기에 한 번에 여러 가지 일을 할 수 없다.
그렇기에 알바가 일을 해도 일이 끊임없이 쌓이게 된다.

매니저는 일이 너무 많이 쌓여서 효율이 없다고 판단하게 되어 알바를 여러 명 쓰게 된다.
근데 하루는 일이 평소보다 많이 안 들어와 놀고 있는 알바가 보이게 된다.
어떤 날은 일이 많고 어떤 날은 일이 많지 않다.
그래서 매니저는 알바들을 합숙시키게 된다.(Thread Pool)
이렇게 일이 밀릴 때마다 한 명씩 내려와 일을 시키는 양상이 돼버린 것이다.

이렇게 사람으로 생각하면 끔찍하지만 하나의 부품들로 생각하면 편하고 효율적인 것이다.

+ Recent posts