Post

Node.js란?

이 그림 보면 바로 이해된다. 단, 그림에는 나와있지 않지만 libuv는 커널에서 NIO 지원하는 작업이라면 굳이 thread 쓰지 않는다.

  • Node.js는 V8 엔진을 사용해 js -> binary로 바꿔주고, 이를 실행하는 “ 런타임 플랫폼 “ 이다. (자바의 JRE 처럼)

참고로 JS 엔진(V8)은 이런 일을 한다

node는 싱글스레드 기반의 이벤트루프를 사용한다. - O

  • “하지만 libuv에서 worker thread 사용하는데?!”
    • 이는 low-level에서 비동기 처리가 불가능한 것을 thread로 wrapping해서 고수준에서는 비동기처럼 보이게끔 하는 것에 가깝다.
      • 다른 언어나 플랫폼에서도 nio 지원 안되는 blocking 함수들 thread로 wrapping하는 경우가 있는데, 이와 비슷하다.
    • 그림에는 나와있지 않지만 해당 플랫폼에서 비동기 처리가 가능한 작업이라면, (e.g., windows의 IOCP를 쓸 수 있다면) 굳이 worker thread 사용할 필요 없으므로, 이를 사용해서 커널단 까지 nio가 이어지도록 한다.
    • 아무튼 이러한 처리는 저수준에서 알아서 해주는거고, 우리가 실제로 js로 개발할 때는 싱글 스레드 기반의 비동기 환경이라고 인지하고 개발해야 하므로 , node는 싱글 스레드 기반의 언어다. 라고 얘기해도 무리가 없어 보인다.
  • 근데 node 10 버전 이상 부터는 고수준에서도 멀티스레드 사용 가능하지 않나?
    • 맞다. 노드 10 버전부터는 고수준에서 worker_threads 에 명시적으로 작업을 던져 스레드 기반의 동시처리가 가능하다.
    • 그 전까지는 CPU bound 작업을 처리하기가 어려웠는데, 이 lib이 나오면서 CPU bound 작업을 스레드에 던질 수 있게 되었다.

참고

This post is licensed under CC BY 4.0 by the author.