본문 바로가기

서비스 창작 기록

Node.js 개발자 면접 질문 "Node.js 는 싱글 쓰레드인가요? 멀티 쓰레드 인가요?"

노드JS는 이벤트 루프 구조라는 것 이미 잘 알고 있으시죠?

그러면 노드JS는 싱글 쓰레드 일까요? 멀티 쓰레드 일까요?

싱글 쓰레드 이벤트루프

노드JS는 하나의 쓰레드만이 루프를 돌고 이벤트 방식으로 여러 작업을 같은 쓰레드에서 처리 하는 것은 맞아요.

하지만 어떻게 하나의 쓰레드에서 네트워크, 파일 I/O, 타이머 같은 여러 작업들을 비동기적으로 처리할까요?

숨겨진 쓰레드

사실 노드에는 숨겨진 쓰레드들이 있습니다.

노드는 위 작업들의 비동기 처리를 위해서 libuv 라는 라이브러리를 사용하는데, 이 라이브러리는 실상 여러 쓰레드를 써서 네트워크, 파일 I/O, 타이머 작업들을 시스템에게 요청하게 됩니다.

그리고 결과만 메인 쓰레드에게 보내는 형식이죠.

 

하지만 이 쓰레드들은 개발자들이 직접 사용할 수는 없어요.

그러면 노드는 무조건 싱글 쓰레드로 코딩해야 할까요?

멀티 쓰레드 필요성

사실 대부분의 케이스에서는 싱글 쓰레드로도 문제가 없어요.

하지만, 만약 CPU 집약적인 작업이 생기면, 한시적으로 병목 현상이 발생할 수 있어요.

그러면 이같은 작업은 따로 쓰레드를 파서 병렬적으로 작업 할 수 있을까요?

차일드 프로세스와 워커 쓰레드

이를 위해 노드는 차일드 프로세스랑 워커 쓰레드 모듈을 제공하고 있어요.

차일드 프로세스는 말그대로 프로세스 하나 더 만들어서 처리하는것이고, 독립 공간에서 안전하게 처리 가능한 장점이 있죠.

워커 쓰레드는 같은 프로세스 내에서 쓰레드만 하나 더 파는 거라, 가볍고 메모리를 공유 할 수 있다는 장점이 있어요.