ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 싱글 스레드
    JavaScript/Node.js 2019. 5. 26. 18:22

    노드는 싱글 스레드로써 작업을 모두 하나의 스레드로 처리한다.

    자바스크립트와 노드에서 논블로킹이 중요한 이유는 바로 싱글 스레드 기반이기 때문이다.

    한 번에 하나의 일밖에 처리할 수 없기 때문에 작업에서 블로킹이 발생하면 다음 일을 처리하기까지 기다려야하는 문제가 발생한다.

     

    싱글 스레드, 블로킹 & 논블로킹, 멀티 스레드에 대해서 알아보자.

    1-1. 싱글 스레드 & 블로킹 모델

    싱글 스레드에 블로킹 방식은 한 고객의 일이 모두 완료되기 전까지 다음 고객들은 기다려야만 한다.

    • 점원 : 스레드
    • 고객 : 작업

    점원 한 명이 고객1의 주문을 받아 주방에 넘긴다.

    주방에서 요리가 완료될 때까지 점원은 기다리고, 요리가 완료되면 점원은 다시 고객에게 요리를 배달하여 작업을 마무리 짓는다.

    그 다음 고객2의 주문을 받고 행위를 반복한다.

    이러한 시스템에서의 문제점은 주문을 하기 위해 기다리는 고객들이 앞의 작업들이 완료될 때 까지 기다려야하는 불편함이 생긴다.

    이런 작업 흐름이 바로 싱글 스레드 & 블로킹 모델이다.

     

     

     

    1-2. 싱글 스레드 & 논블로킹 모델

    싱글 스레드에 논블로킹 방식은 모든 고객의 요청을 받은 후 완료되는 순서대로 응답을 해준다.

    이번엔 점원이 고객1의 주문을 받은 후 주방에 넘기고 다음 고객들의 주문을 받아 주방에 넘긴다.

    한 고객의 요리가 완료되기까지 기다리지 않고 모든 고객의 주문이 들어오는 것을 받아 주방에 넘기는 것이다.

    그리고 주방에서 요리가 완료되면, 완료되는 순서대로 고객에게 서빙한다.

    (주문한 순서와 서빙하는 순서는 일치하지 않을 수 있다. 먼저 완료되는 요리 순서대로 고객에게 서빙한다.)

    이 방식이 싱글 스레드 & 논 블로킹 모델이며, 노드가 채택하고 있는 방식이다.

    이 방식의 문제점은 스레드가 문제가 발생하는 경우 모든 작업이 중단된다는 점이다.

     

     

     

    1-3. 멀티 스레드 & 블로킹 모델

    멀티 스레드에 블로킹 방식은 각각의 고객에게 점원이 한명씩 맨마킹을 붙는다.

    각각의 고객에게 점원이 한명씩 붙어 응대한다.

    언뜻 보기엔 좋아보이지만 고객이 늘어나면 늘어날 수록 점원의 수도 늘어나야한다.

    또 고객이 줄어들면 줄어들 수록 점원도 줄어들어야 한다.

    이는 고용비용과 해고비용이 드는 큰 문제가 발생한다.

     

     

     

    노드 프로세스는 하나의 스레드만 가진다.

    요청이 많이 들어오면 한 번에 하나의 요청을 처리한다.

    블로킹이 심하게 일어나지만 않으면 하나의 스레드로 충분하다.

     

    사실 노드 프로세스는 내부적으로 여러 개의 스레드를 가지고 있는데, 개발자가 제어할 수 있는 스레드는 하나이기 때문에 싱글 스레드라고 부르는 것이다.

     

    노드는 스레스를 늘리는 대신, 프로세스 자체를 복사하여 여러 작업을 동시에 처리하는 멀티 프로세싱 방식을 채택했다.

     

    • 프로세스 : 운영체제에서 할당하는 작업의 단위이다. 프로세스 간 메모리 등의 자원을 공유하지 않는다는 특징이 있다.
    • 스레드 : 프로세스 내에서 실행되는 흐름의 단위이다. 하나의 프로세스는 스레드를 여러 개 가질 수 있다. 스레드들은 부모 프로세스의 자원을 공유한다는 특징이 있다. 즉, 같은 메모리에 접근할 수 있다는 뜻이 된다.

     

     

     

    이 글은 다음과 같은 내용을 참고하여 공부한 챕터를 정리한 내용입니다.

    Node.js 교과서 - 길벗 출판사

    'JavaScript > Node.js' 카테고리의 다른 글

    로우 레벨로 살펴보는 Node.js 이벤트 루프  (0) 2019.08.01
    Cross Origin 허용하기  (0) 2019.07.05
    논블로킹 I/O  (0) 2019.05.26
    이벤트 기반 (Event-Driven)  (0) 2019.05.25
    자바스크립트 런타임  (0) 2019.02.24
Designed by Tistory.