Runtime이란 프로그래밍 언어가 구동되는 실행 환경을 의미한다.
그리고 자바스크립트가 데이터를 어떻게 비동기 처리하는지 이해하려면 이런 외부 환경(Runtime)과 내부 환경(Engine)을 이해해야 한다.
JS에선 코드가 실행될 때 콜 스택에 하나씩 콜(호출)이 쌓인다.
자바스크립트는 싱글 스레드 프로그래밍 언어이기 때문에 한번에 한가지의 코드만 실행할 수 있다.
콜 스택이란 프로그램에서 우리가 어디에 있는 기록하는 데이터 구조이고, 함수가 실행될 때 해당 함수의 기록이 스택에 하나씩 쌓이는 가상의 공간을 의미한다.
Last In, First Out
의 구조를 갖고 있다.객체가 선언될 때, 객체에 대한 값이 저장되고 특정 "주소"로부터 참조해서 사용한다.
값이 정해진 원시값(int, char, boolean...) 등과는 달리 객체는 크기를 정할 수 없다.
이벤트 루프의 역할은 Call Stack과 Task Queue를 주시하는 것이다.
Call Stack이 비워지면 Task Queue에 쌓여있던 Task를 새로 콜 스택에 쌓는다.
이 과정이 바로 비동기 함수가 호출되는 방식이고, 싱글 스레드인 자바스크립트가 비동기적으로 데이터를 처리할 수 있는 이유다.
태스크 큐는 콜백 함수들이 대기하는 Queue ( First In, First Out ) 형태의 배열이다.
setTimeout()
이나 setInterval()
같은 비동기 함수의 콜백 함수, 이벤트 핸들러가 일시적으로 보관되는 영역인 것이다.모든 비동기 API들 (Web API 같은)은 작업이 완료되면 콜백 함수를 태스크 큐에 추가한다.
이벤트 루프는 '현재 실행중인 태스크가 없을 때' ( 주로 호출 스택이 비워졌을 때 ) 태스크 큐의 첫 번째 태스크를 꺼내와 실행한다.
마이크로 태스크들은 실행하면서 새로운 마이크로 태스크를 큐에 추가할 수도 있다.
반대로, 이벤트 루프는 매크로 태스크 큐에 있는 것을 실행시키기 시작할 때 있는 매크로 태스크만 실행시킨다.
결론적으로 자바스크립트가 비동기 함수를 호출할 수 있는 것은 런타임 환경으로 인한 것이다.
이벤트 루프는:
아직 전부 정리하진 못 했지만... ☠️
적어도 자바스크립트에서 비동기 처리를 하기 위해 어떠한 과정이 일어나는지 조금 알 것 같았다.
앞으로 공부를 하면서 더 알게되면 업데이트 해야겠다.
출처: