→ 싱글 스레드인데 JS가 싱글 스레드이면서 동시성을 가질수 있는 이유는?
자바스크립트 동작 원리에 대해 알면 답이 나온다!!
JavaScript Engine
Rendering Engine
출처 : https://miro.medium.com/max/700/1*FA9NGxNB6-v1oI2qGEtlRQ.png
Call Stack
→ JS 가 싱글스레드 기반의 언어라는 말 = JS 가 하나의 메인스레드와 하나의 콜스택을 가짐!
Task Queue(Event Queue)
→ Event Loop는 현재 실행 중인 태스트가 없는지, 태스크 큐에 태스크가 있는지 반복적 확인
Heap
JavaScript 런타임은 자체적으로 비동기 지원 X! → 런타임 환경에서 담당(브라우저, Nodejs 등)
각 이벤트를 스케쥴링하는 것은 그것을 둘러싸고 있는 환경!! (비동기 작업들도 환경에서 지원함!)
→ 위 이미지가 JS의 엔진과 외부 런타임 환경 조화된 모습
출처 : https://seolhun.github.io/assets/images/contents/20180404/js/js-eventloop.png
console.log('첫번째로 실행됩니다.');
setTimeout(() => console.log('최소 1초 후에 실행됩니다.'), 1000);
console.log('언제 실행될까요?');
//츨력
첫번째로 실행됩니다.
언제 실행될까요?
최소 1초 후에 실행됩니다.
console.log('첫번째로 실행됩니다.');
setTimeout(() => console.log('최소 0초 후에 실행됩니다.'), 0);
console.log('언제 실행될까요?');
//츨력
첫번째로 실행됩니다.
언제 실행될까요?
최소 0초 후에 실행됩니다.
/*
setTimeout의 인자인 딜레이 시간은 정확한 시간X
->setTimeout의 콜백 함수가 태스크 큐에 쌓여도 콜스택에 쌓여있는 함수들의
실행 시간에 따라 지연 가능!
*/
→ 동기 작업 = 다른 코드들을 [블로킹]
→ 비동기 작업 = [논블로킹]Web API에게 넘겨줌으로 해당 작업 완료시 까지 다른 코드들 실행 가능
Syncronous
동기 : 요청을 보낸 후 해당 요청의 응답을 받아야 다음 동작을 실행하는 방식
Asynchronous
비동기 : 요청을 보낸 후 응답과 관계없이 다음 동작을 실행하는 방식
Blocking
블로킹 : 자신의 수행결과가 끝날 때까지 제어권을 갖고 있는 것
non-blocking
논블로킹 : 자신이 호출되었을 때 제어권을 자신을 호출한 쪽으로 넘기고 자신을 호출한 쪽에서 다른 일을 할 수 있도록 하는 것
→ 비슷하지만 다른 개념!
페이지 렌더링 동작을 방해하지 않고 브라우저의 응답도 끊지 않으면서 연산량이 많은 코드를 실행할 수 있는 방법은 비동기 콜백!
→ JS는 싱글 스레드인데 비동기가 어떻게 가능할까?
바로 JS는 비동기 작업들은 런타임 환경에게 넘겨줌으로써, 해당 작업이 완료될 때까지 다른 코드들 실행 가능
( JS가 싱글스레드 기반이지만 비동기 작업을 수행하고 동시성을 가지고 논블로킹I/O가 가능)