ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NodeJS 4가지 특징
    개발언어/Node.js 2022. 7. 9. 15:38

     

    1. JavaScript Runtime

    EcmaScript 표준과 WebAssembly를 구현한 V8(c++)이라는 chome brower에서 사용하고 있는 강력한 JavaScript Engine은 c++로 작성이 되어 있고 open source 프로젝트이다. JavaScript Runtime Enviroment이기 때문에 NodeJS JavaScript 언어를 사용할 수 있다.

    2. Single Thread

    NodeJS에서 동작하는 App은 Single Thread이다. 

     

    Thread/Process

    운영체제(Operation System)에서 여러가지 프로그을 동시에 실행하게 되면 각각 프로그램마다 프로세스가 할당이 된다. 즉 프로세스가 프로그램이라고 봐도 무방하다.

     

    프로세스가 병렬적으로 실행되는 것처럼 보이지만 사실 컴퓨터가 이 프로세스 저 프로세스 각각 시간을 할당하면서 마치 병렬적으로 처리되는 듯한 효과를 준다. 물론 어떤 CPU를 사용하느냐에 따라 진짜 병렬적 처리가 이루어질 수있다.

     

    Process

    • code : 프로그램에대한 code
    • stack :  프로그램 안에서 어떤 함수가 실행되는지 함수의 실행 순서를 기억
    • heap :  동적으로 생긴 data를 보관
    • data : 전역 변수등 다양한 변수를 보관하고 있다.

    프로세스가 실행이 되다가 중간에 문제가 생기면, 프로그램이 더이상 동작하지 않거나  프로그램이 반응이 없거나 예상하지 못하게 죽었다고 Popup이 뜨는 경우가 발생한다.

     

    프로세스 안에서 필요한 모든 자원들을 Resource라고 부른다.

     

    프로세스안에서 file을 요청하고 받아와서,음악을 재생한다고 했을 때 => 프로세스가 절차적으로만 진행을 한다고 하면, 파일을 요청해서 받을 때까지 기다렸다가 음악을 재생해야 한다. 이런 일 들을 처리하는 동안 사용자가 사용자가 어플리케이션에서 클릭을 해도 이 클릭을 처리할 수 가 없다. 절차적으로 진행 되기 때문이다.

     

     

    하지만 프로세스 안에는 여러가지 thread가 존재하게 되는데, 음악을 재생하는 thread, file을 주고 받는 thread, 그리고 스트리밍을 하는 thread 이렇게 원하는 기능마다 개별적인 thread를 만들어서 process를 여러개 동시에 실행하는 것처럼 한프로세스 안에서도 여러가지 thread를 동시 다발적으로 실행할 수 있다.

     

    이런 thread도 동시에 실행되는 것 같지만 process 내부에서 thread들에 순차적으로 시간을 할당해 주면서 동시에 실행되는 것처럼 보여지게 한다. 쉽게 thread를 일꾼이라고 생각하면 된다. process안에 각각 기능을 담당하고 있는 일꾼들을 만들어서 개별적 즉 병렬적으로 일을 처리 할 수 있도록 해준다.

     

    이렇게 보면 thread가 많을 수록 좋을 것 같지만 사실 그렇지만은 않다 첫번째로 thread가 동작하기 위해서 필요한 정보들을 개별적으로 만들어야 하기 때문에 메모리(CPU)사용량이 증가할 수 있고,

     

    두번째 로 thread의 갯수가 많아지면 여러가지 thread를  scheduling해서 순차적으로 모든 thread에게 역할을 다주어야 하기때문에 이런 것에도 비용이 발생한다.

     

    세번째로 여러가지 thread가 process안에 있는 공통된 resource에 접근을 하게 되면 어떤 thread가 update하는 동안 다른

    thread가 더 이상 공통 resource에 접근할 수 없는 등 의 일이 발생 하기 때문에  thread가 많다고 무조건 좋은 것은 아니다.

     

    JavaScript는 Single Thread언어로 Multithreading을 만들 수 없다. 그래서 하나의 일을 수행하면 그것이 끝날 때까지 기다렸다가 다 끝나야지 다음 동작으로 넘어가는 동기적인 언어라고 볼 수 있다.

     

    JavaScript 자체는 Single Thread이지만 NodeJS에서 제공하는 Non-blocking I/O와 Event-Driven 두가지 Runtime Enviroment 특징 때문에 여러가지 일들을 동시 다발적으로 혹은 조금더 효율적으로 할 수 있다.

     

    3. Non-Blocking I/O

    I/O

    input과 output을 의미한다. 컴퓨터에서 file혹은 database을 읽고 쓰거나, network에 요청을 하고 응답을 받아 오는 것 또는 컴퓨터 내에서 하드웨어적인 즉 물리적인 계층을 통해서 읽고 쓰는 등의 행동들을 I/O라고 한다.

     

    I/O와 상반되는 개념으로 항상 CPU를 꼽을 수 있다. 사람통해 비유를 하자면 CPU는 사람이 가지 두뇌와 대응되고,  I/IO는 우리가 외부적으로 읽고 쓰는 것을 의미한다.

     

    Blocking

    blocking은 동기적(synchronous)인 것을 의미한다. 하나의 작업을 요청하고 그것이 끝날 때까지 기다렸다가( = blocking을 했다가) 다음으로 넘어가는 방식이다.

    Non-Blocking

    blocking하지 않는 비동기적 방식(asynchromous) 하나의 작업을 수행할 때  다른 작업 요청이 오면 기다리지 않고, 요청이 들어온 다른 작업을  call back으로 던져주고 나서, 처음 하던 작업이 끝나면, 다음 작업으로 넘어가는 것이다. 이때 callback은 원래 예정되어 있던 순서의 작업이 다 끝나면 처리된다. NodeJS 뿐만 아니라 browser에서 동작하는 JavaScript Runtime Enviroment에서도 동일하게 동작한다. 

     

     

    4.Event-Driven

    callback을 던져주고 나서, 예정된 작업이 다 끝나는 event가 발생하면 callback을 호출하라와 같이 event를 통해서 등록한 callback을 호출 할 수 있도록 해준다.

     

    [출처 -https://academy.dream-coding.com/courses/node ]

    '개발언어 > Node.js' 카테고리의 다른 글

    NodeJS Process 정보  (0) 2022.07.09
    Node.js-Event-Driven  (0) 2022.07.09
    NodeJS 운영체제 정보  (0) 2022.07.08
    NodeJS 최신 Module(export/import)  (0) 2022.07.08
    NodeJS Module(export, require)  (0) 2022.07.08

    댓글

Designed by Tistory.