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 |