싱글 쓰레드기반(자바 스크립트의 메인 쓰레드인 이벤트 루프가 싱글 쓰레드이기 때문, 다만 웹브라우저나 NodeJS같은 멀티 쓰레드 환경에서 실행된다)이다.
크롬은 자바스크립트 엔진으로 V8을 사용한다.
- Memory Heap
- Call Stack
- Web APIs: 비동기 처리를 담당한다.
- Callback Queue
- 콜백큐 내부에 Task Queue(Event Queue)[SetTimeout이 담기는 곳], Microtask[Promise가 담기는 곳], Queue(Job Queue), Animation Frames가 존재한다.
- 비동기 처리가 끝난 후 실행되어야 할 콜백 함수가 차례 로 할당된다.
- Event Loop
- Queue에 할당된 함수를 순서에 맞춰 Call Stack에 할당해준다.
- 이벤트 루프는 콜백큐 내부에서 Microtask Queue > Animation Frames > Task Queue 순으로 탐색한다.
console.log("시작");
setTimeout(function () {
console.log("중간");
}, 0);
Promise.resolve()
.then(function () {
console.log("프로미스")
}
);
console.log("끝");
// 시작 -> 끝 -> 프로미스 -> 중간
Promise는 '동기' 방식으로 동작하는데 .then을 만나면 '비동기'로 동작을 하게 된다.
V8 엔진 작동 방식
- JIT(Just In Time) 컴파일 기법
- 소스코드를 컴파일링과 컴파일링 된 코드 실행을 따로 하지 않고 동시에 진행하는 기법이다.
- 코드를 실행하는 시점에서 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하는 방법과 실행하기 전에 프로그램 코드를 기계어로 번역하는 방법을 혼합한 방식이다.
- 실행 시점에서 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.