LHJ

I'm a FE developer.

1.1.5 싱글 스레드

08 Jun 2020 » node_book

1.1.5 싱글 스레드

이벤트 기반, 논블로킹 모델과 더불어 노드를 설명할 때 자주 나오는 용어가 하나 더 있습니다.
바로 싱글 스레드입니다.
스레드를 이해하기 위해서는 프로세스도 알아야 하지만, 지금은 그냥 스레드가 컴퓨터 작업을 처리할 수 있는 일손이라고 생각하면 됩니다.
조금 뒤에 자세히 알아봅니다.

노드가 싱글 스레드라는 말을 들어보셨나요?
노드는 싱글 스레드이므로 주어진 작업을 혼자서 처리해야 합니다.
반대로 멀티 스레드인 시스템에서는 여러 개의 스레드가 일을 나눠서 처리할 수 있습니다.

자바스크립트와 노드에서 논블로킹이 중요한 이유는 바로 싱글 스레드이기 때문입니다.
한 번에 한 가지 일밖에 처리하지 못하므로 어떠한 작업에서 블로킹이 발생하면 다음 일을 처리하지 못합니다.

언뜻 보면 여러 개의 일을 동시에 처리할 수 있기 때문에 멀티 스레드가 싱글 스레드보다 좋아 보입니다.
하지만 꼭 그런 것만은 아닙니다.
이해를 돕기 위한 예시를 하나 들어보겠습니다.

한 음식점에 점원이 한 명 있습니다.
손님은 여러 명이고요.
점원 한 명이 주문을 받아 주방에 넘기고, 주방에서 요리가 나오면 손님에게 서빙을 합니다.
그 후 다음 손님의 주문을 받습니다.
이런 구조라면 다음 손님은 이전 손님의 요리가 나올 때까지 아무것도 못 하고 기다리고 있어야 합니다.
이것이 바로 싱글 스레드(점원), 블로킹 모델입니다.
매우 비효율적입니다.

이번에는 점원이 한 손님의 주문을 받고, 주방에 주문 내역을 넘긴 뒤 다음 손님의 주문을 받습니다.
요리가 끝나길 기다리지 않고 주문이 들어왔다는 것만 알려주는 것입니다.
주방에서 요리가 완료되면 완료된 순서대로 손님에게 서빙합니다.
주문한 순서와 서빙하는 순서가 일치하지 않을 수도 있습니다.

이것이 싱글 스레드, 논블로킹 모델입니다.
바로 노드가 채택하고 있는 방식입니다.
점원은 한 명이지만 혼자서 많은 일을 처리할 수 있습니다.
하지만 그 점원 한 명이 아파서 쓰러지거나 하면 큰 문제가 생길 수 있습니다.
또한, 주문을 받거나 서빙을 하는 데 시간이 오래 걸린다면 주문이 많이 들어 왔을 때 버거울 수 있습니다.

멀티 스레드 방식에서는 손님이 올 때마다 점원이 한 명씩 맡아 주문을 받고 서빙합니다.
언뜻 보면 싱글 스레드보다 좋은 방법인 것 같지만, 장단점이 있습니다.
일단 손님 한 명당 점원도 한 명이면 서빙 자체는 걱정이 없습니다.
점원 한 명에게 문제가 생겨도 다른 점원으로 대체하면 되기 때문입니다.
하지만 손님의 수가 늘어날수록 점원의 수도 늘어납니다.
손님의 수가 줄어들었을 때 일을 하지 않고 노는 점원도 있다는 것도 문제가 됩니다.
점원을 새로 고용하거나 기존 직원을 해고하는 데는 비용이 발생합니다.

그렇다면 점원 여러 명(멀티 스레드)이 모두 논블로킹 방식으로 주문을 받으면 더 좋지 않을까 하는 의문이 들 수 있습니다.
실제로 그렇습니다.
노드도 싱글 스레드 여러 개를 사용해 멀티 스레딩과 비슷한 기능을 하게 할 수 있습니다.
하지만 엄밀히 말하면 멀티 스레딩이라기보다는 멀티 프로세싱에 가깝습니다.
그럼 프로세스와 스레드의 차이에 대해 알아봅시다.

  • 프로세스는 운영체제에서 할당하는 작업의 단위입니다.
    노드나 인터넷 브라우저 같은 프로그램은 개별적인 프로세스입니다.
    프로세스 간에는 메모리 등의 자원을 공유하지 않습니다.
  • 스레드는 프로세스 내에서 실행되는 흐름의 단위입니다.
    하나의 프로세스는 스레드를 여러 개 가질 수 있습니다.
    스레드들은 부모 프로세스의 자원을 공유합니다.
    즉, 같은 메모리에 접근할 수 있습니다.

스레드를 작업을 처리하는 일손으로 표현하기도 하는데, 노드 프로세스는 일손이 하나인 셈입니다.
요청이 많이 들어오면 한 번에 하나의 요청을 처리합니다.
블로킹이 심하게 일어나지만 않는다면 하나로도 충분합니다.

사실 노드 프로세스도 내부적으로는 스레드를 여러 개 가지고 있습니다.
하지만 여러분이 직접 제어할 수 있는 스레드는 하나뿐이므로 흔히 싱글 스레드라고 부르는 것입니다.

노드는 스레드를 늘리는 대신, 프로세스 자체를 복사해 여러 작업을 동시에 처리하는 멀티 프로세싱 방식을 택했습니다.
자바스크립트 언어 자체가 싱글 스레드 특성을 띠고 있기 때문입니다.
4.5절의 cluster 모듈과 15.1.5절의 pm2 패키지에서 멀티 프로세싱을 가능하게 하는 방법에 대해 알아봅니다.