자바스크립트는 싱글 스레드로 동작한다. 따라서 한 번에 하나의 태스크만 처리할 수 있다. 하지만 브라우저가 동작하는 것을 살펴보면 태스크가 동시에 처리되는 것 처럼 느껴진다.
이는 이벤트 루프(Event Loop)가 자바스크립트의 동시성을 지원하기 때문에 가능한 것이다. 이벤트 루프는 브라우저에 내장되어 있는 기능 중 하나이다.
1. 콜 스택, 힙
대부분의 자바스크립트 엔진은 크게 2개의 영역으로 구분할 수 있다.
∙ 콜 스택(call stack)
: 소스 코드 평가 과정에서 생성된 실행 컨텍스트가 추가, 제거되는 스택 자료 구조인 실행 컨텍스트 스택.
함수를 호출하면 함수 실행 컨텍스트가 순차적으로 콜 스택에 푸시되어 순차적으로 실행된다. 자바스크립트 엔진은 단 하나의 콜 스택을 사용하기 때문에 실행중인 실행 컨텍스트가 종료되어 콜 스텍에서 제거되기 전까지는 다른 어떤 태스크도 실행되지 않는다.
∙ 힙(heap)
: 객체가 저장되는 메모리 공간.
객체는 원시값과 달리, 크기가 정해져있지 않으므로 할당해야 할 메모리 공간의 크기를 런타임에 결정한다. 따라서 힙은 구조화 되어 있지 않다는 특징이 있다.
➡️ 콜 스택의 요소인 실행 컨텍스트는 힙에 저장된 객체를 참조한다.
2 . 태스크 큐, 이벤트 루프
비동기 처리 작업을 할 때, 자바스크립트 엔진은 소스코드의 평가와 실행만을 담당한다. 나머지 작업들은 브라우저나 Node.js가 담당한다. 이때 브라우저 환경은 태스크 큐와 이벤트 루프를 제공한다.
∙ 태스크 큐(task queue = 이벤트 큐 = 콜백 큐)
: setTimeout, setInterval과 같은 비동기 함수의 콜백 함수, 이벤트 핸들러가 일시적으로 보관되는 영역.
(+ 마이크로태스크 큐 : 프로미스의 후속 처리 메서드의 콜백 함수를 일시 보관하는 영역)
∙ 이벤트 루프( event loop )
: 콜 스택에 실행 중인 실행 컨텍스트가 있는지, 태스크 큐에 대기중인 함수가 있는지 반복해서 확인한다.
만약, 콜 스택이 비어 있고 태스크 큐에 대기 중인 함수가 있다면 '이벤트 루프'는 순차적( FIFO )으로 '태스크 큐'에 대기 중인 함수를 '콜 스택'으로 이동시킨다. 콜 스택으로 이동한 함수는 실행된다.
➡️ 태스크 큐에 보관된 함수들은 비동기 처리 방식으로 동작한다.
< 정리 >
자바스크립트 엔진은 싱글 스레드로, 브라우저는 멀티 스레드로 동작한다. 이 때문에 자바스크립트가 비동기로 동작 할 수 있는 것이다.
이벤트 루프는 콜 스택과 태스크 큐를 계속 확인하고, 만약 콜 스택이 비어있다면 태스크 큐에서 콜 스택으로 푸쉬하여 함수를 실행시킨다.
출처: 모던 자바스크립트
'💻공부한 내용 정리 > 자바스크립트' 카테고리의 다른 글
[모던 자바스크립트] var, let, const 키워드와 스코프 (0) | 2023.02.21 |
---|---|
[모던 자바스크립트] 스코프 (0) | 2023.02.17 |
[모던 자바스크립트] 16장. 프로퍼티 어트리뷰트 (0) | 2023.02.03 |
[모던 자바스크립트] 10장. 객체 리터럴 (0) | 2023.01.28 |
[모던 자바스크립트] 브라우저의 렌더링 과정 (0) | 2023.01.09 |