Node.js

21.02.18 Node.js 동작 원리, Event loop

슈팅스타제제 2021. 3. 6. 16:27

✔ Nodejs

Node.js는 싱글스레드로 이루어져 있다. 

그 스레드는 이벤트 루프라는 것을 실행하는 메인스레드이다.

 

이때, 이벤트 루프는 개발자가 생성한 자바스크립트 코드(콜백 함수)를 제어하는 곳이다. 

*이벤트 루프가 코드를 실행한다고 생각하면 X, 코드를 실행하는 곳은 자바스크립트 엔진인 V8이다. 

 

✔ Libuv

Node.js는 이벤트 루프를 작동시킬 때, libuv라는 비동기식 라이브러리를 사용한다. 

node.js는 싱글 스레드이지만 비동기 메소드를 수행하기 위해 libuv에서 4개의 스레드 풀을 만들고 

이를 백그라운드에서 동시에 처리한다. 이로 인해 싱글스레드이지만 작업 처리는 멀티 스레드로 할 수 있는 것이다. 

그리고 nodejs가 싱글 스레드 논블로킹 I/O 방식으로 처리할 수 있는 이유는 블로킹 작업 또한 libuv 스레드 풀에서 처리하여 이벤트 루프가 블로킹되지 않도록 하기 때문이다. 

 

The architecture of Node.js (공식문서 자료 X) 

✔ Event Loop Process

1. 이벤트 루프에 진입하기 전에 콜백함수를 실행하라고 명령

2. libuv를 호출하는 함수가 있으면 non-blocking 작업을 지시 

3. 호출된 작업에 대한 동기/비동기 검사

4. 스레드 풀의 워커스레드에 작업을 할당

5. 작업 완료된 콜백함수를 각 단계 별 큐에 등록

6. 코드를 다 실행했으면 libuv가 등록한 콜백을 확인

7. 있으면 3번 루프, 없으면 이벤트 루프 종료

 

이벤트 루프의 작업 단계

✔ Event Module

이벤트 루프 내에 존재하는 이벤트에 대해 이해하기 위해 이벤트 모듈을 사용하여 이벤트 생성, 호출, 삭제해보았다. 

(nodejs 교과서 p.159 예제 참고)

이벤트에 콜백을 연결한 것이지 이를 혼동해서는 안된다. 콜백함수는 비동기식 메소드에서 결과를 반환할 때 호출되지만, 이벤트는 다음과 같은 이벤트 관리 체계를 가지고 있는 것이 특징이다. 

 

Event observer pattern