Node JS 동작원리

JM.dev·2021년 12월 1일
1

기술면접

목록 보기
1/2

Node JS란❓
Javascript를 브라우저 밖에서도 실행시킬 수 있는 Javascript런타임입니다. Javascript을 실행시킬 수 있는 환경이라는 뜻이죠.

NodeJS 동작원리

NodeJS의 동작 원리를 알기 위해서는 javascript의 동작원리를 먼저 알아야 합니다.
javascript 는 싱글 스레드로 동작하는 언어입니다. 싱글 스레드이기 때문에 한 번에 하나의 작업만 처리할 수 있게 되죠.

자바스크립트의 동작원리에 대해 먼저 알아보자

Javascript

  • 메모리 힙 : 메모리 할당을 담당하는 곳
  • 콜 스택 : 코드가 호출되면서 스택으로 쌓이는 곳

Javascript 런타임 자체에서는 비동기 API를 지원하지 않습니다. 동시성을 보장하는 비동기, 논블로킹 작업들을 Javascript 엔진을 구동하는 런타임 환경에서 담당합니다. 여기서 런타임 환경은 NodeJS, 브라우저를 말하게 되죠.

Javascript의 엔진은 단지 코드에 대한 실행환경입니다. 각 이벤트를 스케쥴링하는 것은 그것을 둘러싸고 있는 환경이며 비동기 작업들도 이러한 환경에서 지원하죠

web api

  • 브라우저에서 지원하는 api로 Dom 이벤트 Ajax, setTimeout 등의 비동기 작업들을 수행할 수 있도록 api를 지원합니다

이벤트 루프

  • 이벤트 루프는 이벤트 발생 시 호출되는 콜백 함수들을 관리하여 테스크 큐에 전달하고 테스크 큐에 담겨있는 콜백 함수들을 콜 스택에 넘겨줍니다.
  • 단 이때 이벤트 루프는 콜 스택을 확인하고 콜 스택이 비어있는 경우에만 테스크 큐에 콜백 함수를 넘겨주게 됩니다.

테스트 큐

  • web api에서 비동기 작업들이 실행된 후 호출되는 콜백 함수들이 기다리는 공간입니다.

런타임 환경에서 어떻게 비동기 코드가 실행될까 ?

  1. javascript 콜 스택 실행
  2. 비동기 작업 이벤트 발생
  3. web api 에서 비동기 작업들 수행
  4. 테스트 큐에 저장
  5. 이벤트 루프를 통하여 콜스택으로 테스트 큐 스택들을 콜백

Node.js 동작원리

이벤트 기반
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 처리하는 방식입니다. NodeJS는 이벤트 리스너에 등록해둔 콜백 함수를 실행하는 방식으로 동작합니다. 즉 이벤트 루프가 이를 가능하게 해 줍니다.

NodeJS를 크게 나눠보면 내장 라이브러리와 V8 엔진 그리고 libuv로 구성됩니다. NodeJS의 특성인 이벤트 기반, 논 블로킹 I/O 모델들은 모두 libuv 라이브러리에서 구현됩니다.

콜백 함수들은 libuv 내에 위치한 이벤트 루프에서 관리 및 처리됩니다.
이벤트 루프는 라운드 로빈 방식으로 노드 프로세스가 종료될 때까지 여러 페이지들을 계속 순회합니다. 페이즈들은 각각의 큐들을 관리하고 각각의 큐는 FIFO 순서로 콜백 함수들을 처리하게 됩니다.

NodeJS에서 논블로킹 I/O 모델은 Input Output 이 관련된 작업(데이터베이스 CRUD, 파일 시스템) 등의 블로킹 작업들은 백그라운드에서 수행하고 이를 비동기 콜백 함수로 이벤트 루프에 전달하는 것을 의미합니다.

libuv는 어떻게 동작할까
NodeJS는 기본적으로 libuv 위에서 동작하여 node 인스턴스가 생성될 때 libuv 에는 스레드 풀이(기본값은 4개의 스레드)가 생성됩니다. libuv는 OS 커널이 어떤 비동기 작업들을 지원해주는지 알고 있기 때문에 libuv의 스레드는 커널이 지원하지 않는 작업들을 수행하게 됩니다.

이벤트 루프의 내부 동작 과정

이벤트 루프는 6 phase 들로 구성되어있습니다. 각 phase 들을 FIFO 큐를 가지고 있고 이벤트 루프가 해당 phase를 라운드 로빈 방식으로 순환하면서 실행되게 됩니다.

timers

setTimeOut(), setIntever() 같은 timer 함수들이 처리가 됩니다.

I/O callbacks

클로즈 콜백, 타이머로 스케쥴링된 콜백, setImemediate를 제외한 거의 모든 콜백들이 큐에 놓이게 됩니다.(http, api 호출, db 조회 등)

poll

poll 큐에 있는 이벤트 콜백들을 처리합니다. 이때 poll에 쌓인 콜백 함수들을 실행하게 되는데 더 이상 실행할 콜백 함수가 없을때에는 규칙에 따라 다음 단계로 넘거가거나 대기하게 됩니다. 일단 check 단계를 검사하여 setImemediate 가 있는지 확인하고 setImemediate 가 있으면 check 단계로 넘어가게 됩니다. 만약 setImemediate 가 없다면 timer 단계에 실행할 timer 함수가 있는지 확인하게 됩니다. timer 단계로 넘어갈 수있을때까지 대기하고 도중에 poll 큐에 콜백함수가 들어온다면 즉시 실행합니다.

check

setImediate() 콜백이 호출되고 실행됩니다.

close callbacks
. on('close') 같은 이벤트에 따른 콜백 함수를 실행합니다.

profile
차곡차곡 한단계 씩

0개의 댓글