Event Loop

ECMAScript에는 동시성이나 비동기와 관련된 언급이 없다.
비동기 요청, 동시성에 대한 처리는 브라우저나 Node가 처리
Node에서는 비동기 I/O를 지원하기 위해 libuv 라이브러리가 이벤트 루프를 제공
heap : 메모리 할당이 발생
call stack: 실행된 코드의 환경을 저장하는 자료구조. 함수 호출 시 push됨
Web APIs: 브라우저가 제공하는 API
Event Table: 특정 event가 발생했을 때 어떤 callback 함수가 호출되야 하는지 알고있는 자료구조
Callback Queue(Task Queue?): 이벤트 발생 시 실행해야 할 callback 함수가 추가됨
Job Queue: 개별적으로 실행되는 스크립트 블럭을 하나의 Job이라고 하고 이러한 Jobs를 적재하는 FIFO 큐
Event Loop: Call Stack과 Callback queue를 감시, call stack이 비어있을 경우, Job Queue 확인하고 비어있을 경우 Callback Queue애서 함수를 꺼내 Call Stack에 추가
setTimeout의 delay 인자가 delay ms 후에 실행되는 것을 보장하지는 않음. delay ms 후에 callback queue에 들어가는 것을 보장

Job Queue

개별적으로 실행되는 스크립트 블럭을 하나의 Job이라고 하고 이러한 Jobs를 적재하는 FIFO 큐가 바로 Job Queue
ScriptJobs - 일반적인 스크립트 코드를 실행하는 job
PromiseJobs - 프로미스의 해소나 예외로 분기되어 실행될 함수가 적재되는 job으로, Promise를 사용할 경우 Job Queue를 사용하게됨을 알 수 있음
실행중인 Execution Context가 없고 EC stack이 비워져있을 때 다음 Job이 실행된다. 하나의 Job이 시작하게 되면 그 job이 완전히 실행되기 전까지는 다른 Job을 시작할 수 없음
Promise의 then은 PromiseJob으로 등록된다.
Job Queue는 Callback Queue보다 우선순위가 높다. 따라서 Event Loop는 Call Stack이 비어있을 경우 Job Queue에서 기다리는 모든 작업을 처리하고 Callback Queue로 이동함

Reference