Node.js 정의

Node.js는 크롬 V8 Javascript 엔진으로 빌드된 Javascript 런타임 입니다. Node가 무엇인 지 알기 위해 노드 공식 사이트에 게시된 설명을 들고 왔습니다.

  • 노드를 통해 다양한 자바스크립트 애플리케이션을 실행
  • 서버 APPLICATION을 실행하는 데 가장 많이 사용
  • 자바스크립트 프로그램이 서버로서 가능하기 위한 도구를 제공하므로 서버역할을 수행
  • 자바스크립트 실행기

이러한 특징이 있지만 자바스크립트의 실행 속도 문제 발생하여 구글에서 V8 엔진을 사용하여 크롬을 출시하였고 당시 V8 엔진은 다른 자바스크립트에 엔진과 달리 매우 빠르며 오픈 소스로 코드를 공개했습니다.

구조

node는 v8과 더불어 libuv라는 라이브러를 사용합니다. V8과 libuv는 C++로 구현되어 있습니다.
자바스크립트 코드는 노드가 V8과 libuv에 연결해줍니다.
libuy 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있습니다.

특징

이벤트 기반

  • Node.js는 Chrome V8 엔진과 libuv library로 이루어져 있으며 libuv에서 비동기를 처리한다.
  • libuv는 이벤트 기반으로 비동기를 처리한다.
  • 여러 이벤트가 동시에 발생했을 때 순서는 이벤트 루프가 판단한다.

이벤트 루프

  • 이벤트 발생 시 호출할 콜백 함수들을 관리
  • 호출된 콜백 함수의 실행 순서를 결정
  • 노드가 실행 종료될 때까지 이벤트 처리를 위한 작업을 반복 (loop)

논 블로킹 I/O 모델

대부분의 애플리케이션은 Blocking I/O를 사용합니다. Blocking I/O란 하나의 프로세스가 어떤 자원을 사용하고자 할 때 그 자원을 다른 프로세스가 점유하고 있다면, 그 프로세스가 자원의 사용을 마칠 때까지 기다리는 것을 말합니다. 내가 쓰고자 하는 자원을 다른 사람이 자원을 쓰고 있다면 자원의 사용을 마칠 때까지 기다린다는 것이죠. 기다리는 상태를 Blocked 되었다고 표현하며 아무것도 하지 않는 상태가 됩니다.

멀티 쓰레드

보통 하나의 프로세스가 하나의 요청에 대해 대응하고 그 일을 처리하게 되는데, 웹서버와 같이 다수의 요청이 들어오게 된다면 멀티 쓰레드라는 개념을 사용할 수밖에 없습니다. 멀티 쓰레드는 말 그대로 쓰레드 여러 개가 동시에 실행되어 요청을 처리한다는 개념입니다. 한 명이 일하는 것보다 여러 명이 일하는 것이 성능이 좋겠죠? 하지만 멀티 쓰레드를 사용하게 되면 많은 자원을 필요로 하게 되고 결국 CPU도 하나의 자원이기 때문에 여러 쓰레드들이 CPU를 점유하기 위해 기다릴 수밖에 없는 근본적인 문제가 있습니다. 위에서 얘기한 것처럼 Blocking I/O는 요청을 하고 응답이 올 때까지 아무것도 하지 않고 시간을 낭비하기 때문에 쓰레드 지연에 대한 문제도 생기게 됩니다. 또 멀티 쓰레드를 위해 스케줄링을 하게 되면 문맥 전환 비용(Context Switch)이 발생하게 됩니다. 쉽게 말해 쓰레드를 분배하기 위해(멀티 쓰레드) 사용하는 스케줄링도 CPU를 이용해 연산이 필요한 작업이기 때문에 쓰레드가 많아질수록 문맥 전환에 따른 성능 저하가 발생한다는 뜻입니다.

참고 자료 :https://node-js.tistory.com/27

태그:

카테고리:

업데이트:

댓글남기기