2021-06-27
Javascript는 Single Thread 언어라는 것은 대부분 알고 있는 사실일 것이다. 자바스크립트의 Main Thread인 Event Loop가 Single Thread 이기 때문인데 그렇다면 도대체 Thread는 무엇일까? 그전에 알아보았던 Process와도 관련이 많아보이고,,, 도대체 Thread가 무엇인지 알아보자!
가장 기본은 Thread의 정의부터 알아보자
Thread는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다. (출처:위키백과)
정의를 읽어보니, Thread는 Process 내에 존재하는 녀석인가보다. Process와 깊은 인연이 있어보인다. Process와는 어떤 관련이 있는 것인지, 둘이 비슷한 녀석들인지 좀 더 구체적으로 알아보자.
우선, Process가 어떻게 구성되어있는지 먼저 파악해보자. 프로세스는 하드 디스크에 설치 되어 있는 프로그램을 메모리상에 실행 중인 작업이다. 자원을 할당받고 할당받은 자원을 제어해서 작업한다. 프로세스가 프로그램을 실행할 때, Code, Data, Stack, Heap의 구조로 되어있는 독립된 메모리 영역을 아래 그림처럼 할당받는데 메모리 영역에 있는 Code, Data, Stack, Heap을 자원으로 보면된다.
Thread는 하나의 프로세스 내에서 동작되는 실행흐름이며 프로세스 내의 자원을 제어하는 역할을 한다. 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 갖고 있다. 하나의 프로세스안에 여러개의 Thread가 존재할 수 있다. 프로세스 내에서 각각 Stack만 따로 할당을 받고 Code, Data, Heap 영역을 공유받는다.
Thread 구성요소
- Thread ID : 자기 고유번호
- Register : PC(프로그램카운터:코드의 어디를 실행하는지 가리킨다.), 상태정보, SP(stack pointer)등 제어를 위해 필요한 정보
- Stack : 자신의 작업영역으로 지역데이터가 저장된다.
메모리영역을 공유하다보니 독립적인 프로세스와는 달리 thread간 데이터를 주고 받는게 간단해지고 시스템 자원 소모가 줄어들고, 응답시간 또한 단축된다. 프로세스와는 달리 Code, Data, Heap 영역을 공유하므로 Stack 영역만 처리를 하면 되므로 처리 비용이 감소한다.
그렇다면 Single Thread와 Multi Thread의 차이점은 무엇일까?
Single Thread는 하나의 프로세스에서 하나의 thread만 실행가능하고 하나의 레지스터와 스택으로 표현된다.
- 장점
1. 자원 접근에 대한 동기화를 신경쓰지 않아도 된다.
여러개의 스레드가 공유된 자원(code,data,stack)을 사용할 경우, 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근이 통제되어야 하는데 이는 프로그래머에게 많은 노력과 비용을 발생시킨다. 단일 스레드 모델에서는 이러한 작업이 필요하지 않다.
2. 작업전환 작업을 요구하지 않는다.
작업전환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.- 단점
여러개의 CPU를 활용하지 못한다는 단점이 있다. 두 개의 작업을 하나의 스레드로 처리하는 경우와, 두 개의 스레드로 처리하는 경우를 가정했을 때, 후자의 경우는 짧은 시간 동안 2개의 스레드가 번갈아가면서 작업을 수행한다. 그래서 동시에 두 작업이 처리되는 것과 같이 느끼게 된다. 하지만 thread간의 Context Swithcing에 시간이 많이 걸려 오히려 시간이 더 걸릴 수 있다. 따라서 단순히 CPU만을 사용하는 계산작업이라면, 오히려 멀티스레드보다 싱글스레드로 프로그래밍하는 것이 효율적일 수 있다.
Multi Thread는 프로그램을 다수의 실행 단위로 나누어 실행하고 프로세스 내에서 자원을 공유하여 자원 생성과 관리의 중복을 최소화시킨다. 서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공하며 각각의 스레드가 고유의 레지스터와 스택으로 표현된다.
- 장점
새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르며 프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다.
프로세스의 작업전환보다 스레드의 작업전환이 더 빠르다.- 단점
하나의 스레드만 실행중일 때는 실행시간이 오히려 지연될 수 있고 멀티 스레딩을 위해 운영체제의 지원이 필요하며 thread 스케쥴링을 신경써야 한다.