1 minute read

노드란 무엇인가?

  • 오픈소스, 크로스 플랫폼, 백엔드
  • 자바스크립트 런타임 환경
  • V8 엔진
  • 브라우저 밖에서 돌아가는 자바스크립트

노드의 4가지 특징

  • JavaScript Runtime Ecmascript와 WebAssembly를 구현한 8이라는 크롬 브라우저에서 사용하고 있는 강력한 자바스크립트 엔진은 C++로 만들어졌고 오픈소스 프로젝트이며 성능이 좋습니다.
  • Single Thread
  • Non-Blocking I/O
  • Event-Driven

프로세스와 스레드 운영체제에서 여러가지 프로그램을 동시에 실행하게 되면 각각 프로그램마다 프로세스가 할당됩니다. 프로세스가 프로그램이라고 봐도 무방합니다. 프로세스가 병렬적으로 실행되는거 처럼보이지만 컴퓨터가 엄청 빠른 속도로 각 프로세스에 시간을 할당하면서 마치 병렬처럼 처리되도록 하는 효과를 줍니다. 각각 프로세스를 살펴보면 프로그램의 코드와 각 프로그램에서 어떤 함수가 실행되는지 함수의 실행 순서를 기록하고 있는 스택과 동적으로 생긴 데이터를 보관하는 힙, 그 외의 전역변수나 다양한 변수를 보관하고있는 data로 나뉘어져있습니다. 프로세스에서 필요한 모든 자원을 리소스라고 부르겠습니다. 리소스안에서 파일을 요청하고 받아와서 재생한다면 프로세스가 절차적으로만 진행을 하게 되면 파일을 요청해서 받을때까지 기다렸다가 재생을 해야합니다. 하지만 프로세스에는 여러개의 스레드가 존재합니다. 음악을 재생하는 스레드, 파일을 주고받는 스레드, 스트리밍을 하는 스레드 원하는 기능마다 개별적인 스레드를 만들어서 프로세스를 동시에 실행하는거 처럼 한 프로세스 안에서도 여러가지의 스레드를 동시다발적으로 실행할 수 있습니다. 스레드를 일꾼이라고 보면 됩니다. 프로세스 안에 각각 담당하고 있는 일꾼들을 만들어서 개별적으로 병렬적으로 일을 처리할 수 있게 해줍니다. 이렇게 본다면 스레드가 많으면 많을수록 좋을거같지만 아닙니다. 스레드가 동작하기 위해서 필요한 정보를 개별적으로 만들어줘야하기때문에 메모리 사용량이 증가할 수 있고 스레드 개수가 많아지면 여러가지 스레드를 스케줄링해서 순차적으로 기회들을 줘야하기때문에 비용이 발생합니다. 한 프로그램 내에서 여러 스레드를 쓰는것을 멀티스레딩이라고 합니다. 자바에서는 cuncurrency API를 제공하여 멀티스레딩을 지원합니다.

자바스크립트는 싱글 스레드 언어입니다. 하나의 일을 수행하면 그것이 끝날때까지 기다렸다가 다음동작으로 넘어가는 동기적인 프로그램 언어입니다.

Non-Blocking I/O, Event-Driven을 통해 여러가지 일들을 동시다발적으로 또 더 효율적으로 할 수 있습니다.

I/O는 Input과 Output을 말합니다. 데이터베이스에서 읽고 쓰거나 네트워크에 요청하고 받아오는 컴퓨터 내부에서 하드웨어적인, 물리적인 것을 읽고쓰는 이러한 행동을 I/O를 말합니다. I/O의 상반되는 것으로 CPU를 말합니다. Block하지 않은 비동기적인 방식입니다. 하나를 수행할때 기다리지않고 콜백을 던져주고 나서 니가 다 수행하고 나서 이 콜백을 실행해줘라고 하고 다음으로 넘어갑니다. Node.js뿐만 아니라 브라우저에서 동작하는 자바스크립트 런타임 환경에서도 동일한 방식으로 동작합니다.

Event-Driven방식은 콜백을 던져주고 나서 파일을 다 읽으면 내 콜백을 호출해라고 이벤트를 통해서 내가 등록한 콜백을 호출할 수 있게 해줍니다.

Node.js 런타임 환경에 우리 소스코드를 동작하게 하면 Node.js 어플리케이션 형태로 동작하게 됩니다. 동적으로 생성한 데이터를 저장하는 힙, 함수의 순서를 기록하는 스택, 함수가 호출된 순차적인 흐름을 기록할 수 있고 어디로 돌아가야하는지 알 수 있습니다. image

node.js 메인 싱글스레드 노드js내부에서 멀티스레드로 동

Updated:

Leave a comment