싱글 스레드는 하나의 힙 영역과 하나의 콜 스택을 가진다. 하나의 콜 스택을 가진다는 의미는 한 번에 한 가지 일 밖에 하지 못한다는 의미이다.
예를 들어 네트워크 요청을 한다면, 응답이 올 때까지 다른 일은 하지 못하고 마냥 기다릴 수밖에 없다. 이것이 문제되는 이유는 웹 브라우저에서 코드가 실행되는데, 코드가 종료될 때까지 유저가 클릭을 해도 어떠한 반응을 하지 않는 상태가 된다. 사용자에게 원활한 UI를 제공해야 한다면, 콜 스택이 멈추게 해서는 안 된다. 콜 스택이 멈춘 상황을 블로킹 상태라고 한다.
논 블로킹은 즉, 비동기 콜백을 사용하는 것이다.
자바스크립트를 실행하기 위해서는 자바스크립트 엔진이 필요하다. 자바스크립트 엔진은 자바스크립트 코드를 실행하는 프로그램 또는 인터프리터이다.
자바스크립트 엔진의 대표적인 예시로는 구글의 V8 엔진이 있다. 파이어폭스의 SpiderMonkey, 사파리의 Webkit 등이 있지만, 크롬에서 사용하는 V8이 가장 대중적으로 알려져 있다.
자바스크립트 엔진의 주요 구성요소로는 메모리 힙(Memory Heap)과 콜 스택(Call stack)이 있다.
콜 스택 -> 코드 실행에 따라 호출 스택이 쌓이는 곳, 콜 스택은 함수가 실행되는 순서를 기억한다. 함수를 실행하려면 스택의 가장 위에 해당 함수를 넣게 되고, 함수에서 리턴이 일어나면 스택의 가장 위쪽에서 함수를 꺼낸다.
메모리 힙 -> 메모리 할당이 일어나는 곳
const num = 1
라는 코드는 num이라는 변수를 위해 메모리 공간을 할당하고, 그 공간에 1이라는 값을 할당앞서 설명한 것처럼 자바스크립트 엔진은 싱글 스레드 기반 언어이기 때문에, 다른 작업을 수행하려면 현재 수행중인 작업이 끝날때까지 기다려야 하는 문제점이 있었다. 또한, 많은 시간이 걸리는 작업을 수행하게 된다면 프로그램이 엄청나게 느려질 우려 역시 존재했다.
그렇기 때문에, 오랜 시간이 걸리는 작업들은 백그라운드에서 처리하고 간단하게 처리할 수 있는 작업들만 콜 스택에서 처리한다면 효율적으로 처리가 가능하였다. 이러한 과정들이 가능하게 해준 것이 바로 자바스크립트 런타임이다.
자바스크립트는 싱글 스레드 방식으로 동작한다. 하지만 싱글 스레드 방식으로 동작하는 것은 브라우저가 아니라 브라우저에 내장된 자바스크립트 엔진일 뿐이고, 만약 모든 자바스크립트 코드가 자바스크립트 엔진에서 싱글 스레드 방식으로 동작한다면 자바스크립트는 비동기로 동작할 수 없으며 프로그램의 처리 속도와 무게가 효율적으로 진행되지 않을 것이다. 즉, 자바스크립트 엔진은 싱글 스레드로 동작하지만 브라우저는 멀티 스레드로 동작하며, 이는 Web API, Callback Queue, Event Loop에 의해 가능하다.