Node.js의 구조

devAnderson·2021년 12월 29일
0

TIL

목록 보기
2/103

사전지식

  • 프로그램 => 운영체제로부터 자원을 할당을 받으며 실행이 가능한 논리 단위이다
  • 프로세스 => 운영체제로부터 자원을 할당받은 후실제 메모리에 탑재되어 운영되고 있는 프로그램의 단위이다.
  • 스레드 => 프로세스 안에서 작업을 실행할 수 있는 실행단위를 뜻한다.
    1. 스레드들은 프로세스가 할당받은 자원들을 공유한다 (코드 = 실행 명령어, 데이터 = 스태틱 변수 등, 힙 = 동적 메모리)
    2. 스레드들은 각자가 고유한 스텍을 가지고 있다(작업스텍)
    3. 스레드들은 각자 고유한 레지스터를 가지고 있다( 해당 스레드가 프로세스의 어느 실행 명령어까지 실행했는지를 확인하는 기억절차)

<프로세스와 스레드>


Node.js의 스레드

  • Node.js는 자바스크립트 파일을 브라우저가 아닌 환경에서도 실행할 수 있도록 만들어진 런타임이다(런타임 = 기계어가 실행되는 환경)
  • 즉, 운영체제에서 자원을 받아 실행되고 있는 프로세스이고, 무수한 스레드로 처리가 이루어지는 멀티스레드이다.
  • 그러나, 이 스레드들 가운데 자바스크립트 코드를 처리하는 스레드는 하나이기 때문에 자바스크립트를 처리하는 의미에서는 싱글스레드이다.
  • Node.js는 크롬에서 사용되는 자바스크립트 엔진인 V8과, 이벤트를 기반으로 한 논블로킹 처리를 위해 libuv라는 라이브러리가 존재한다.
  • 그리고 상단에는 서로 다른 언어를 "연결" 해주기 위한 Node.js Bindings가 있다.
  • 예를들어, 자바스크립트는 파일을 읽을 수 있는 방법이 없다. 하지만 Node.js에서는 자바스크립트 안에서 코드를 통해 "fs.readFile"과 같은 행위로 파일을 읽을 수 있는데, 이것이 가능한 이유는 Node.js Bindings에서 C++ 에서 가능한 작업인 "파일읽기"를 마치 자바스크립트와 연결하여 자바스크립트가 그런 행위를 하듯이 처리를 해주기 때문이다.
  • 즉, Node.js Bindings를 통해 다른 언어에 있는 기능을 자바스크립트를 통해서 사용할 수 있게 해준다.

  • 자바스크립트 엔진인 v8은 Memory와 CallStack으로 이루어져 있다.

  • 여기서 Memory는 자바스크립트 파일이 컴파일타임에서 분해되면서 변수등이 저장되는 메모리 공간을 뜻한다.

  • callstack은 실행 컨텍스트를 단위별로 하여 해당 메모리에 저장된 내용들을 기반으로 순서대로 호출 스텍이 쌓이는 자료구조이다.

  • 이때의 작업은 동기적 형태로, 한 작업이 진행중이면 다른 작업이 진행될 수 없다.

  • 비동기적 작업은 libuv library에서 이벤트 기반으로 처리된다

  • library라는 이름에 걸맞게, 이 장소에는 마치 브라우저의 webAPI와 같이 비동기적으로 처리되야 하는 이벤트들이 등록되어 있는 장소다

  • 자바스크립트 파일이 읽히면서 이 라이브러리에 등록된 비동기 작업이 콜스텍에 호출되어 들어가 있다면,

  • 이를 이벤트처럼 인식하여 캐치한 후 대기열에 집어넣는데 이때 대기열이 두가지가 있다.

    1. Thread pool은 비동기 작업인데, OS 따라 내부 처리 과정에서 blocking을 일으킬 수 있는 작업일 경우를 모아두는 장소다(이벤트 루프 스레드를 멈추게 하는 것을 방지하기 위한 내부 스레드)
    2. I/O 비동기 관리 poll ( epoll, kqueue 등 다양한 종류)
  • 그 후 대기열에 등록된 콜백작업들의 평가가 끝마쳐지면, 이것을 자바스크립트의 콜스텍이 비워질때마다 집어넣으며 실행한다


Node.js와 웹브라우저의 차이

Browser Node.js
DOM 조작을 위한 API 제공 및 document, window 객체를 통한 브라우저 컨트롤 File시스템 관련 API 제공(보안을 위해 브라우저는 제공되지 않음)
최신 코드문법들에 대해 브라우저의 지원이 늦어지면 Babel을 통해 폴리필을 적용 필요에 따라 언제든지 Node.js의 버전을 바꿀 수 있음
모듈 시스템으로 ES 모듈을 사용함 (import, export) 모듈 시스템으로 CommonJs를 사용함( package.json에서 type:"module"로 ES 모듈을 사용할 수도 있음)

reference

what is node.js binding

profile
자라나라 프론트엔드 개발새싹!

0개의 댓글