Node.js는 싱글스레드 인가요? Node.js 런타임이 동작하는 방식을 설명해주세요.

Sang heon lee·2021년 12월 17일
0

기술면접준비

목록 보기
7/16
post-custom-banner

Javascript

  • Call Stack: 콜 스택. 명령문이 쌓이며 하나씩 순차적으로 명령문을 실행하며 해당 명령문을 제거하는 자료 구조.
  • Web APIs: 자바스크립트 혹은 더 넓은 범위로 웹 관련 기술을 지원하는 인터페이스의 모음.
  • Event Loop: 이벤트 루프, Call Stack과 Callback Queue를 관찰하며 Call Stack이 비어있을때 Callback Queue에서 callback을 - Call Stack에 쌓는 역할을 하는 일종의 Observer.
  • Callback Queue(Task Queue): 콜백 큐, Web API에서 처리가 끝난 후 실행 되어야 하는 Callback(Task)이 순차적으로 쌓이는 자료 구조.

위 그림의 구조는 싱글 스레드에서 이루어진다. 그런데 하나의 콜 스택에서 명령문이 순차적으로 실행된다 것은 지연(pending)을 일으키는 명령문이 있는 경우 프로그램 전체를 멈추게 한다는 의미이다. 그래서 자바스크립트는 지연을 일으키는 명령문들이 Web APIs에서 처리되도록 한다. 그때 명령문이 모두 처리된 후에 호출 될 함수를 하나 함께 넘기는 데 이를 콜백 함수(callback Function)라고 한다. Web APIs에서 처리된 명령문의 콜백 함수는 Callback Queue로 넘겨져 순서를 기다린다. 이때 이벤트 루프(Event Loop)는 실시간으로 두가지 일을 하는데, 하나는 콜 스택이 비워져있는 지 확인하는 것이고 다른 하나는 콜백 큐에 콜백이 있는 지이다. 이벤트 루프는 콜 스택이 비워져 있고 콜백 큐에 콜백이 있으면 그 콜백을 콜 스택으로 옮겨 실행되도록 한다.

하나의 스레드에 하나의 콜 스택에서 지연이 걸리는 작업이 프로그램 전체를 멈추게 하지 않도록 지연이 걸리는 작업을 Web APIs에서 처리하고 이벤트 루프라는 일종의 옵저버로 실행 순서를 제어한다.

Node.js

Nodejs란 Javascript를 브라우저 밖에서도 실행할 수 있도록 하는 Javascript의 런타임 입니다.
이 Nodejs의 특징으로 Non-blocking I/O, 싱글 쓰레드,이벤트 처리 기반 입니다.

Node.js 구조

Node.js 동작하는 방식

자바스크립트 의 콜 스택에 쌓인 이벤트 중 비동기 처리가 필요하게 된경우 libuv 라이브러리를 통해 처리 하게 됩니다.

여러 이벤트(작업) 발생 시 순차적으로 Event Queue 에 쌓이게 됩니다.

이벤트 루프가 순차적으로 백그라운드 혹은 Worker Thread로 이벤트를 넘겨주어 백그라운드 혹은 Worker Thread에서 실제 작업을 진행하게 됩니다. (이벤트 루프는 여러 개의 페이즈(Phase)를 가지며, 각 페이즈는 각자만의 큐를 가지고 있습니다. 또한 Worker Thread default로 4개를 가지기에 멀티 쓰레드 처럼 여러 작업을 비동기적으로 수행가능합니다.)

여러 Phase의 이벤트 루프

결론

Node.js 의 기반이 되는 자바스크립트가 싱글 쓰레드 이기에 Node.js도 싱글 쓰레드라 칭합니다.
하지만 libuv 라이브러리 의 이벤트 루프를 활용하여 여러 작업을 비동기적으로 처리하기에 멀티 쓰레드처럼 이벤트(혹은 작업)를 처리합니다.

출처

Javascript 와 nodejs 간의 싱글 쓰레드 비교
https://gyofeel.github.io/js/nodejs/web/Javascript%EC%99%80-Nodejs%EB%8A%94-%EB%AA%A8%EB%91%90-%EC%8B%B1%EA%B8%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%97%90%EC%84%9C-%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94%EA%B0%80/

흔히 말하는 로직이 틀렸다고 말함.
https://sjh836.tistory.com/149

기본 개념
https://medium.com/@vdongbin/node-js-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC-single-thread-event-driven-non-blocking-i-o-event-loop-ce97e58a8e21

영상 포함
https://so0choi.github.io/2020/09/15/Nodejs/Node-js13/

잘못된 개념 & 상식
https://tk-one.github.io/2019/02/07/nodejs-event-loop/

profile
개초보
post-custom-banner

0개의 댓글