스레드란 프로그램, 특히 프로세스 내에서 실행되는 흐름의 단위이다.
싱글 스레드
하나의 프로세스에서 하나의 스레드를 실행한다.(직렬적으로 실행)
멀티 스레드
하나의 프로세스에서 둘 이상의 스레드를 동시 실행한다.(병렬적으로 실행)
Javascript는 비동기 언어이지만 멀티 스레드가 아니라 싱글 스레드이다.
정확히는 Javascript의 이벤트 루프가 싱글 스레드이기 때문에 Javscript를 싱글 스레드 언어라고 한다. 그리고 이벤트 루프로 인해 비동기 실행이 가능하다.
아래 이미지는 Javascript의 기본적인 실행 구조이며, 보면서 글을 읽으면 이해가 원활하다.
Javascript에서는 하나의 Memory Heap과 Call Stack(단일 호출 스택)을 가지고 있다.
Memory Heap
선언한 변수들이 어디에 저장되어 있는지 기록하는 장치
Call Stack
자바스크립트에서는 수행해야 할 함수들을 스택으로 쌓아 순차적으로 처리한다.
Callback Queue
함수들이 쌓이는 리스트 형태의 자료구조
Event Loop
이벤트 단위로 실행이 된다는 자바스크립트의 개념
함수가 Call Stack에 쌓인다.
쌓인 함수가 하나하나 실행 된다.
실행된 함수가 Call Stack에서 빠진다.(실행 결과는 그대로 남아 있음)
setTimeout은 Web APIs를 사용하는 함수이다.
함수가 Call Stack에 쌓이고 실행되면, Web APIs에 타이머가 등록된다.(2번째 시간 인자)
실행 되었으므로 Call Stack에서 빠진다.
setTimeout이 완료되지 않았더라도 Call Stack에서 빠졌으므로 그 다음 함수가 실행된다.
타이머 시간이 지나면 Callback Queue안으로 이동한다.
Event Loop는 Call Stack을 보고 있다가, 비어있으면 Callback Queue안에 있는 맨 앞쪽 콜백을 Call Stack으로 넣는다.
콜백이 Call Stack으로 들어가서 실행된다. (아직 종료되지 않음)
콜백이 종료되지 않고 안에 또 다른 함수가 있다면, 그 함수가 우선적으로 다시 위에 쌓인다.
콜백 안에 있던 함수가 먼저 실행 후 빠져나간다.
마지막으로 안에 있던 콜백이 완료된다.