공부

멀티 스레드에 대해서

pyupyu 2023. 1. 29. 16:00

스레드란 무엇인가? 

 

 프로세스에 최소 하나씩 있는 실제로 프로그램을 실행하는 단위로, 독자적인 메모리 공간을 stack 할당받고 나머지 공간은 프로세스와 공유한다

 

-> 프로세스의 실질적 실행 단위

 

프로세스는 메모리 공간으로 code, data, stack, heap 영역을 가지고 있다. 이 중 스레드는 stack 부분만 공유를 하고 있다는 것이므로, 독자적인 stack 메모리 공간을 여러 스레드들이 가질 수 있고 나머지 메모리 영역에 접근하는데 있어 충돌이 발생할 수 있다는 문제를 가지고 있다.

-> 멀티 스레드의 단점

 

그럼 멀티 스레드란 무엇인가?

 

멀티 프로세스가 아닌 멀티 스레드를 주로 사용하는데 그 이유는 메모리 공간과 매우 밀접하다.

프로세스같은 경우는 프로세스들이 각자의 메모리 공간을 가지고 있고, 해당 공간에 접근하기 위해서는 context switching을 필요로 하는데, 프로세스간 통신은 IPC를 통해서 일어나는데 이 비용이 너무 크다.

하지만 스레드같은 경우는 stack부분만 가지고 있고 나머지 부분을 공유하고 있기 때문에, 멀티 프로세스에 비해서 멀티 스레드는 context switching의 비용이 낮은 장점이 있다. 

 

왜 사용하는가?

 

멀티 스레드나 멀티 프로세스를 사용하는 이유는 한 가지 일에 매여있지 않고 동시에 여러 일들을 처리하기 위해서이다. cpu에 있는 실제 프로세스의 갯수만큼 동시 실행이 가능하기 때문에 해당 자원을 놀지 않고 잘 분배해서 프로그램의 성능을 올리기 위해서 사용한다.

특히 I/O와 같은 오래 걸리는 작업을 수행해야 할 때, 하나의 스레드로만 작업을 수행하게 되면 병목타임이 너무 크게 발생하게 되는데, 이러한 문제를 멀티 스레드를 사용함으로 해결할 수 있다.

 

 

스레드 풀이란?

 

스레드를 생성하고 제거하는데에 있어 많은 비용이 발생하게 된다. 

그럼 스레드를 생성하고 대기를 시키다가 필요할 때 사용을 하게 된다면? 이 비용을 절감할 수 있게 된다.

이렇게 스레드를 운용하는 방식이 스레드 풀이다.

초기에 지정된 갯수만큼의 스레드를 생성하고, 스레드 요청이 들어오면 풀에 자고 있는 스레드들을 깨워서 작업을 처리하고, 작업이 끝나고 나면 다시 스레드 풀에서 관리를 하는 방식으로 작동한다.

 

 

TLS( Thread Local Storage )란?

 

스레드는 stack만 독자적인 메모리 공간으로 할당받는다고 하였다.

그럼 전역변수와 같은 data영역에 저장되는 변수는 어떻게 사용을 할까? 

이것이 불가능하기 때문에 이를 위해서 사용하는 것이 TLS이다. 

TLS는 윈도우 프로그래밍에선 win api로 tls 공간을 할당하게 되는데, 이 할당된 공간은 해당 스레드만 접근이 가능한 전역공간이 된다. 이 공간을 사용하여 필요한 정보들을 저장하면, 데이터를 가져오는데 있어 경합을 일으키지도 않고, 안전하게 작업을 수행할 수 있다.