서버/Node

NodeJS 작동 원리

realtrynna 2022. 7. 25. 19:50

 

Nodejs 작동 원리

V8 엔진은 자바스크립트 실행을 담당하는 호출 스택을 담당하며, libuv는 비동기 I/O이벤트 루프를 담당한다.

  • 노드 실행은 하나의 스레드에 의해서만 수행되고 하나의 콜 스택을 가짐
  • 콜 스택은 동기적 블로킹 작업이므로 이를 극복하기 위해 Event Loop를 추상화한 libuv를 사용
  • libuv 내부에 Event Loop는 메인 스레드에 상주하여 비동기 작업을 수행 요청의 특징(블로킹 또는 논 블로킹)에 따라 Thread Pool에 작업을 위임하고 콜백 함수를 실행하기 위해 Event Queue에 적재된 콜백 함수를 빈 상태의 콜 스택으로 이동시킴
  • Event Loop는 6개의 단계로 이루어져 있으며 각 단계별로 Event Queue를 소유 Event Loop는 각 단계를 순차적으로 순회하며 반복적으로 콜백 함수들을 처리

 

 

1. 클라이언트가 노드 서버로 요청(블로킹 또는 논 블로킹)

2. 노드는 들어오는 요청을 Event Queue에 추가

3. 들어온 요청은 Event Loop를 통해 하나씩 전달되며 블로킹 작업인지 논 블로킹 작업인지 판단

4. Event Loop는 I/O 폴링과 같은 간단한 요청(논 블로킹 I/O)을 처리하고 클라이언트에게 응답을 반환

  • 블로킹 I/O 요청일 경우 Thread Pool에 단일 스레드로 전달되며 해당 스레드는 데이터베이스 접근 파일 시스템 제3자 라이브러리 리소스를 처리하여 특정 블로킹 I/O 작업을 수행 후 클라이언트에게 응답을 반환

 

CPU Bound와 I/O Bound

CPU Bound: CPU 자원을 사용하는 작업을 의미 노드에서는 V8 엔진에 의해 처리되며 I/O Bound를 제외한 자바스크립트 코드들이 해당된다.
I/O Bound: Disk fileSystem Network Database와 관련된 작업을 의미 해당 작업은 이벤트 큐에 등록되며 이벤트 루프에 의해 처리된다.

 

싱글 스레드의 의미

노드 프로세스 실행 시 기본적으로 4개의 스레드가 생성되는데 개발자가 제어할 수 있는 스레드는 하나이므로, 싱글 스레드라고 불린다. 나머지 스레드들은 블로킹 I/O 작업들을 처리하고 콜백 함수를 이벤트 루프에 등록하는 역할을 한다.

 

싱글 스레드 논 블로킹 I/O

libuv 라이브러리의 이벤트 루프의 추상화 구현체를 통해 싱글 스레드이지만 논 블로킹 I/O 구현이 가능하다. 

 

이벤트 루프 단계

 

1. Timer 

  • 타이머 단계는 이벤트 루프의 시작 단계 setInterval과 setTimeout 같은 타이머 관련 콜백 함수를 처리하며, 타이머들이 호출되자마자 Event Queue에 들어가는 게 아니고 내부적으로 min-heap 형태로 타이머를 구성하고 있다가 실행되면 그 순간 Event Queue로 콜백 함수를 이동시킨다.

 

2. Pending Callbacks

  • pending_queue에 들어있는 콜백 함수들을 실행하는 단계 pending_queue에는 이전 루프에서 완료된 콜백(Network I/O 종료 후 응답받는 경우) 또는 에러 콜백이 쌓인다.

 

3. Idle, Prepare

  • Event Loop 매번 순회 시 실행되며 4단계 Poll을 위한 준비 작업을 하는 단계

 

4. Poll

  • 대기 중인 콜백 함수를 콜 스택으로 가장 많이 올려보내는 단계 새로운 수신 커넥션을 위한 Socket과 Data를 설정하며, Poll 단계에서는 watch_queue를 바라보며 작업을 수행한다. 만약 Queue가 비어있지 않다면 배정받은 시간 동안 Queue가 모두 소진될 시점까지 콜백 함수를 콜 스택으로 올려 실행시킨다.

 

5. Check

  • setImmediate 함수만을 위한 단계 setImmediate를 사용하여 수행한 콜백 함수만 Event Queue에 쌓이고 콜 스택으로 올라간다.

 

6. Close Callbacks

  • 다음과 같은 close type의 콜백 함수를 관리하는 단계
socket.on('close', () => {})

 

참고 자료

https://evan-moon.github.io/2019/08/01/nodejs-event-loop-workflow/

https://medium.com/zigbang/nodejs-event-loop%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-16e9290f2b30https://betterprogramming.pub/learn-node-js-under-the-hood-37966a20e127

'서버 > Node' 카테고리의 다른 글

NodeJS xlsx Excel  (0) 2023.01.04
NodeJS  (0) 2022.07.23
NodeJS Crawling Puppeteer  (0) 2022.04.18
NodeJS axios cheerio xlsx  (0) 2022.04.18
NodeJS dotenv  (0) 2022.01.20