[TIL] (Node.js)아키텍쳐

호두파파·2021년 9월 3일
0

TIL

목록 보기
2/5
post-thumbnail

Node.js를 짧게 설명하자면?

일반적으로 NodeJs에 대해 설명할 때 논블록킹 I/O 모델을 사용하고 비동기 프로그래밍 스타일을 지원하는 자바스크립트 런타임 환경이라고 정리할 수 있다.

확장성 있는 네트워크 애플레케이션(서버 사이드 등) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용한다. 논블록킹(Non-blocking) I/O와 단일스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.


논 블록킹(non-blocking) I/O
호출 직후 프로그램으로부터 제어가 돌아옴으로서 시스템 호출 종료를 기다리지 않고 다음 처리로 넘어갈 수있다. 즉 논-블록킹 I/O란 데이터 전송을 마치기 전에 기타 프로세스가 계속 작업하도록 하는 비동기 입출력 처리를 말한다.

비동기(Asynchrous) I/O
I/O 처리가 완료된 타이밍으로 결과를 회신하는I/O 모델을 비동기 I/O라고 한다. 비동기 I/O 회신은 시그널 또는 콜백의 형태로 이뤄지며, 회신이 있을때까지 어플리케이션은 다른 작업을 진행할 수있다. 프로세스가 블록 상태가 되지 않는 점에서 논-블록킹 I/O와 같지만 비동기 I/O는 I/O처리를 완료 했을때 통지를 하는 반면 비-블록킹 I/O는 I/O가 처리 가능한 상태를 오류로 판단하는 차이가 있다.

알고 넘어가자 : 논-블로킹 I/O와 비동기 I/O 차이

논-블로킹 I/O는 처리가 완료되지 않으면 에러를 회신하고, 블록 상태로 만들지 않는 반면 비동기 I/O는 처리를 바로할 수 없을때, 처리가 완료되는 시점까지 백그라운드에서 대기하고, 종료한 타이밍을 회신하는 차이가 있다.

출처


자바스크립트는 싱글 스레드로 동작하는데 어떻게 여러 요청을 동시에 받을 수 있을까?

브라우저나 Node.js같은 런타임 환경의 도움을 받아서 여러 요청을 처리할 수 잇는 이유는 바로 자바스크립트가 비동기적으로 코드를 실행하기 때문이다. 덕분에 하나의 요청이 완료되기까지 기다리지 않고 동시에 다른 작업을 실행할 수 있다. 덕분에 하나의 요청이 완료되기까지 기다리지 않고 동시에 다른 작업을 실행할 수 있다.

❗️주의하세요
자바스크립트 런타임 자체에서는 비동기 API를 지원하지 않는다. 동시성을 보장하는 비동기, 논블로킹 작업들은 런타임 환경에서 담당한다.

--

Node.js 내부구조

  • Node.js Core Library (내장 라이브러리)
  • V8 (자바스크립트 엔진)
  • libuv (논블록킹 I/O, 이벤트 기반의 라이브러리)

Node.js 동작원리

Node.js는 자바스크립트 기반의 V8엔진만 있는 것이 아니다. Node.js의 작업을 처리하고 있는 C++ 기반의 libuv라는 라이브러리에 더 주목할 필요가 있다.

위에서 살펴본 논-블로킹 I/O 작업들은 os커널 또는 libuv 스레드 풀에서 담당하게 된다.

  • Libuv는 OS 커널이 해당 작업을 지원하고 있는지 확인하고, OS 커널이 지원하지 않는 작업을 스레드 풀로 던져준다.
  • OS 커널이 지원하지 않는 작업은 스레드 풀로 던져준다.

libuv는 I/O 관련 작업을 백그라운드에서 수행하도록 처리해주고, 덕분에 이벤트 루프틑 꼐속해서 다른일을 처리할 수 있다.

스레드 풀(thread pool)

스레드 풀은 비동기 I/O 라이브러리를 통해 I/O 관련 작업을 비동기로 처리한다.

Node.js에서 동기 작업을 실행하는 경우

이 작업은 항상 메인스레드(싱글스레드인 V8엔진)에서 실행된다.

Node.js에서 비동기 작업을 실행하는 경우

이 작업이 메인스레드에서 실행되지 않을 수도 있다.
해당 작업이 어떤 작업인지에 따라 다른 스레드 풀로 분기되어 처리될 수 있기 때문이다.
libuv의 스레드 풀은 기본적으로 4개의 스레드를 가지는 멀티스레드


출처

Node.js 동작원리
Node.js 내부구조
[JS] Node.js의 아키텍처

profile
안녕하세요 주니어 프론트엔드 개발자 양윤성입니다.

0개의 댓글