cs 공부

Node.js는 single-threaded 기반 JS 런타임입니다. 이에 대해 설명해주세요

늘곰's 2023. 10. 15. 21:37

Node.js는 single-threaded 기반 JS 런타임입니다.
여기서 일단 쓰래드 라는것에 대해 먼저 알아야합니다.

싱글스레드와 멀티스레드를 비교해보면서 스레드에 대한 개념을 알아야합니다.

 

 

 

싱글스레드는 프로세스 내에서 하나의 스레드가 하나의 요청만을 수행합니다.

해당 요청이 수행될 때 다른 요청을 함께 수행할 수 없습니다. 이것을 

싱글스레드 블로킹 모델이라고 합니다. 진행되고 있는 요청이 예정되어 있는 요청을 블로킹하기 때문입니다.

 

멀티스레드는 스레드 풀에서 실행의 요청만큼 스레드를 매칭하여 작업을 수행 합니다.

그렇기 때문에 여러개의 일을 동시에 진행 할 수있습니다. 그렇다면 싱글스레드를 사용하는것보다 훨씬 효율적으로 보입니다. 하지만 멀티스레드도 단점이있는데 스레드를 여러개 생성하다보니 사용하지 않은 스레드의 처리에 비용이 발생하고  스레드의 숫자만큼 자원이 많이 사용됩니다. 또한 코드의 복잡성이 높아지게됩니다.

 

 

싱글스레드와 멀티스레드의 장단점

 

싱글스레드 

장점

  1. 단순성: 싱글 스레드 애플리케이션은 복잡성이 낮으며, 스레드 간 동기화와 경합 조건 문제를 걱정할 필요가 없습니다.
  2. 자원 효율성: 싱글 스레드 애플리케이션은 스레드 간 통신 및 동기화에 필요한 메모리 오버헤드가 적기 때문에 자원을 효율적으로 사용할 수 있습니다.
  3. 이벤트 기반 작업: 이벤트 기반 싱글 스레드 모델은 I/O 밀도가 높은 애플리케이션에서 효과적이며, 이벤트 루프를 통해 비동기 작업을 처리할 수 있습니다.

단점

  1. 성능 한계: 싱글 스레드 애플리케이션은 단일 스레드에서 실행되므로 멀티 코어 프로세서에서 성능을 최적화하기 어렵습니다.
  2. 블로킹 작업: CPU 바운드 작업 또는 긴 처리 시간이 필요한 작업은 싱글 스레드에서 다른 작업을 차단할 수 있습니다.

 

 

멀티스레드 

장점

  1. 성능 향상: 멀티 스레드는 멀티 코어 프로세서에서 병렬로 작업을 처리하므로 성능을 향상시킬 수 있습니다.
  2. 다중 작업 처리: 여러 작업을 동시에 처리할 수 있으므로, 동시성 및 병렬 작업에 적합합니다.
  3. 응답성 향상: 멀티 스레드는 긴 처리 시간이 필요한 작업도 병렬로 처리하므로 애플리케이션의 응답성을 향상시킬 수 있습니다.

단점

  1. 복잡성: 멀티 스레드 애플리케이션은 스레드 간 동기화 및 데이터 공유 문제로 인해 복잡성이 증가할 수 있으며, 버그 및 경합 조건 문제가 발생할 수 있습니다.
  2. 자원 소비: 멀티 스레드 애플리케이션은 스레드 간 통신 및 동기화를 위한 메모리 오버헤드가 발생하고, 높은 메모리 사용량을 필요로 할 수 있습니다.
  3. 데드락: 멀티 스레드에서는 데드락과 같은 스레드 관련 문제에 주의해야 합니다.

 

 

 

Node.js는 싱글 스레드 기반의 JavaScript 런타임이지만, 여러 가지 방법을 통해 싱글 스레드의 일부 단점을 극복하고 동시성과 성능을 향상시키기 위해 다음과 같은 방법을 사용합니다:

 

비동기 프로그래밍: Node.js는 비동기 프로그래밍 모델을 사용하여 I/O 작업과 같은 블로킹 작업을 기다리지 않고 비동기적으로 처리합니다. 이를 통해 다른 작업을 차단하지 않고 동시에 여러 작업을 처리할 수 있습니다.

 

이벤트 루프: Node.js는 이벤트 루프를 사용하여 이벤트와 콜백 함수를 효율적으로 처리합니다. I/O 작업이 완료되면 이벤트 루프를 통해 이벤트를 처리하고 콜백 함수를 실행합니다.

 

논 블로킹 I/O: Node.js는 네트워크 호출, 파일 시스템 액세스 및 데이터베이스 쿼리와 같은 I/O 작업을 논 블로킹 방식으로 처리합니다. 이렇게 함으로써 I/O 작업이 완료될 때까지 기다릴 필요가 없어집니다.

 

이벤트 기반: Node.js는 이벤트 기반 아키텍처를 사용하여 비동기 이벤트 처리를 지원합니다. 이러한 이벤트 기반 모델을 통해 복잡한 애플리케이션을 효율적으로 설계하고 확장할 수 있습니다.

 

스레드 풀: Node.js는 내부적으로 스레드 풀을 사용하여 일부 I/O 작업을 별도의 스레드에서 처리하며, 이를 통해 CPU 및 메모리 리소스를 효과적으로 활용합니다.

 

클러스터링: Node.js는 클러스터링을 지원하여 여러 프로세스를 생성하고 각각을 다른 코어에 할당하여 멀티 코어 프로세서에서 병렬성을 활용할 수 있습니다.

 

 

추가적으로 

노드는 멀티스레드를 지원합니다. 그러므로 node.js가 싱글스레드 라는 말은 원론적으로 이야기하면 틀린이야기입니다. 하지만 이게 아에 틀린 이야기라고 할수는 없는게 노드를 실행하게 되면 프로세스안에 여러개의 쓰레드가 생성됩니다.

하지만 우리가 직접 컨트롤 할 수 있는 쓰레드는 하나뿐입니다. 이러한 이유때문에 노드가 싱글스레드 기반이라고 불리고있습니다. 그리고 노드 14버전부터는 멀티스레드를 사용할수 있도록 지원도 하고있습니다. 하지만 할 수 있다는 것이지 이것을 주력으로 사용하게 되었다는 것은 아닙니다. 멀티스레드를 사용해야한다면 자바와 같은 언어로 구성하는것이 좀 더 효율적일 수 있습니다..

 

 

 

참고 블로그

https://medium.com/@vdongbin/node-js-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC-single-thread-event-driven-non-blocking-i-o-event-loop-ce97e58a8e21

 

Node.js 동작원리 (Single thread, Event-driven, Non-Blocking I/O, Event loop)

Node.js는 어떻게 동작하는가

medium.com