싱글스레드: 하나의 실행흐름을 가지는 모델. 한번의 하나의 작업만 수행
멀티스레드: 여러개의 스레드가 동시에 실행되는 모델. 한 프로세스 내에서 각 스레드는 독립적으로 실행되지만, 공유되는 자원에 접근가능
cf. 스레드란 프로그램내에서 실행되는 작업 최소 단위로, 프로세스 내의 자원을 공유하면서 동시에 여러작업을 독립적으로 실행합니다. (stack을 제외한, code, data, heap영역을 공유)
자바스크립트는 1995년에 넷스케이프에서 개발됐을 당시, 멀티 코어 프로세서가 보편화되지 않았고, 자바스크립트는 웹 브라우저에서 간단한 스크립트 동작을 수행하는 데 주로 사용되었기 때문에 복잡한 병렬 처리를 필요로 하지 않아, 메모리 사용량이 적고, 동기화 문제를 피할 수 있는 싱글 스레드로 구현하였다고 한다.
→ 언어 자체의 설계를 바꾸는 것 보단, 브라우저의 멀티 스레드를 이용하여, 자바스크립트의 비동기 프로그래밍을 지원한다.
메모리힙과 콜스택으로 구성.
JS 런타임 외부에서 자바스크립트의 비동기 실행을 돕기 위해 만들어진 장치.
=> 동기적인 방식은 DX관점에서 직관적이지만, 현대 웹 애플리케이션에서는 많은 다양한 작업을 처리해야할 일이 생겼고 비동기로 작동하는 방식이 필요하게 되었다.
=> 태스크 큐, 이벤트 루프, 마이크로 태스크 큐, 브라우저/Node.js API등이 적절한 생태계를 이루어 싱글스레드로도 비동기 이벤트 처리 가능하게 되었다.
★이벤트루프는 콜스택에 실행중인 코드가 있는지 확인하고, 비어있다면 태스크 큐에 대기중인 태스크 중, 실행가능한 가장 오래된 태스크를 콜스택으로 넘김.
=> 다시 콜스택에서
=> 동시성을 보장하는 비동기, 논블로킹 작업들은 Javascript 엔진을 구동하는 런타임(Runtime) 환경에서 담당함. e.g. 브라우저, Node.js
Javascript는 비동기 작업들을 이렇게 Web api에게 넘겨줌으로써, 해당 작업이 완료될때까지 다른 코드들을 실행할 수 있습니다. 이것이 바로 논블로킹이다.
자바스크립트 동작원리에 대해 설명해주세요