Node.js 동작원리

배병일 ㅣ 2024. 1. 15. 23:04

Node.js의 동작원리는 JS기반이기 때문에 매우 유사하다.

 

해당 글은 Node.js의 특성인 이벤트 기반, 논블로킹 I/O 모델들이 처리되는 libuv 라이브러리에 대해 설명 할 예정

  • 논블로킹 I/O : 입출력 작업을 수행할 때, 작업의 완료를 기다리지 않고 다른 작업을 계속할 수 있는 방식

 

Event Loop


 

이벤트 루프는 6phase로 구성되어 있다.

각 phase는 Queue(큐)와 같은 구조를 가지고 있다.

 

각 phase마다 특정 시간을 할당해서 작업을 처리하는 라운드 로빈 방식으로 순환하며,

지속적으로 요청을 처리할 수 있도록 동작한다.

 

이때 콜백들이 모두 실행되어 phase가 비게 될 경우 다음 phase로 넘어가게 되며,

phase가 바뀌는 것을 Tick(틱)이라고 한다.

 

phase들은 서로 다른 종류의 콜백을 담당하기 때문에

어떤 콜백을 이벤트 루프에 넣는지에 따라 콜백이 어느 phase로 들어갈지 정해지고

이를 이용하여 콜백의 실행 시점을 정할 수 있다.

 

Event Loop 순서


Timer

스케줄링 한 콜백이 실행된다.

  • setTimeout(), setInteravl() ...

Pending

이전 루프에서 마무리 되지 못하고 지연된 I/O 콜백들이 실행된다.

 

ldle , prepare

내부에서 사용되는 I/O를 폴링하기 전에 수행하는 사전 준비를 한다.

  • 따로 외부에 노출되지 않기에 개발자가 직접 지정하는 경우는 거의 없다.

poll

새로운 I/O 이벤트를 가져와서 실행한다.

  • 파일을 읽고 쓰거나 네트워크 통신 등의 콜백을 제외한 대부분 콜백이 실행된다.

check

Node API 중 setimmediate()로 스케줄링 된 콜백들을 호출한다.

 

close

소켓 종료와 같은 일부 close 콜백들이 실행된다.

 

OS Kernel


OS Kernel = System Kernel

 

OS 커널의 API는 운영체제마다 이름이 다르지만

 

커널에서는 이미 수많은 비동기 API를 지원하기 때문에

Libuv는 OS와 일종의 인터페이스 역할을 하고 있다.

OS에서 처리할 수 있는 작업은 위임되어 처리된다.

 

그 외에는 Thread pool에 할당되어 있는 Thread에서 작업한다.

  • 네트워크와 소켓 관련 작업은 OS가 처리
  • 파일 I/O는 Libuv가 직접 처리

비동기 동작의 처리 과정


<Exmple>

1. Event Loop의 pool 단계에 네트워크 I/O 작업이 들어옴

2. 인터페이스를 통해 OS Kernel로 위임

3. OS Kernel에서 작업이 끝나면 Event Loop로 결과를 돌려줌

'Javascript > Node.js' 카테고리의 다른 글

Node.js  (0) 2024.02.16
Node 에서 import export 사용하기 위한 babel 과 type: module 의 차이  (0) 2023.09.23
node-cache  (0) 2023.07.30
Method  (0) 2023.06.13