320x100
320x100

개요

웹 서버에서 클라이언트의 요청을 시스템의 메인 스레드가 직접 처리하는 경우,

이전 클라이언트의 요청을 처리하느라 다음 요청을 처리할 수 없다,

때문에 메인 스레드는 클라이언트의 요청을 받을 때 마다 다른 스레드를 생성하여 작업을 위임한다.

그러나 노드JS는 싱글 스레드 언어인 자바스크립트의 런타임이기 때문에 

클라이언트의 요청 시 마다 스레드를 생성하지 않는다.

그렇다면 어떻게 비동기 처리를 수행할 수 있을까?

 

 

 

 

NodeJS의 동시성

1. 단일 스레드 특성

NodeJS는 단일 스레드로 동작하며, 이는 자바스크립트 코드를 단일 스레드로 순차적으로 실행한다는 것을 의미한다.

스레드를 여러 개 생성하여 여러 작업을 동시에 처리하지 않고 이벤트 중심의 I/O 모델을 활용하여 이를 달성한다.

 

2. 이벤트 중심 아키텍처

NodeJS는 이벤트 루프를 중심으로 하는 이벤트 기반 아키텍처를 사용한다.

비동기 작업 처리는 콜백 및 이벤트 emitter를 통해 이루어지며, NodeJS는 I/O작업이 완료되기를 기다리는 동안 다른작업을 처리할 수 있다.

 

3. 비차단 I/O (non-blocking I/O)

NodeJS는 비차단 I/O 작업을 사용한다.

I/O를 수행하기 위해 함수가 호출되면 다음 작업으로 이동하기 전에 작업이 완료될 때까지 기다리지 않는다.

대신 완료 시 실행할 콜백 기능을 등록한다.

 

 

 

 

실행중인 이벤트 루프

1. 이벤트 수신

비동기 작업이 시작되면 NodeJS가 콜백을 등록하고 다음 작업을 수행한다.

 

2. 기타 이벤트 처리

비동기 작업이 완료되기를 기다리는 동안 이벤트 루프는 대기열의 다른 동기 작업, 이벤트 등을 계속 처리하면서 애플리케이션이 응답성을 유지하도록 한다.

 

3. 콜백 실행

이벤트 루프는 완료 여부를 적극적으로 확인하지 않고 기본 시스템에 의존하여 알림을 제공한다.

비동기 I/O 작업이 시작되면 콜백이 등록된다.

작업이 완료되면 시스템은 콜백을 이벤트 큐에 배치한다.

이벤트 루프는 주기적으로 대기열에 보류중인 이벤트를 확인한다.

완료된 I/O 작업의 콜백이 발생하면 트리거 되어 관련 코드가 실행된다.

 

 

 

 

 

NodeJS 동시성의 이점

1. 확장성

NodeJS는 많은 수의 동시 연결을 처리하는데 탁월하다.

이벤트 기반 모델을 사용하면 연결당 전용 스레드가 필요하지 않고 수많은 연결을 동시에 효율적으로 관리할 수 있다.

 

2. 향상된 성능

비차단 I/O 작업은 I/O 작업이 완료되기를 기다리는 동안 CPU가 공회전 하는 것을 방지하여 성능향상에 기여한다.

따라서 NodeJS는 I/O 요구사항이 높은 애플리케이션에 특히 적합하다.

 

3. 단순화된 코드

NodeJS의 이벤트 기반 비동기 특성은 복잡한 스레드 메커니즘의 필요성을 제거하여 코드를 단순화 한다.

개발자는 멀티 스레드 환경과 관련된 복잡한 코드를 작성할 필요없이 간결한 코드를 작성할 수 있다.

 

 

 

 

 

참고 (자바스크립트의 싱글 스레드 구조)

https://chanyeong.com/blog/post/44

 

자바스크립트는 왜 싱글 쓰레드일까? :: chanyeong

자바스크립트라는 언어는 싱글 쓰레드 언어라고 알려져있다. 보통 싱글 쓰레드라고 하면 한 번에 하나의 작업만 수행할 수 있다고 생각한다. 그렇다면 자바스크립트를 주로 사용하는 웹 사이트

chanyeong.com

 

 

 

 

 

Reference

https://blog.stackademic.com/nodejs-is-single-threaded-but-still-concurrent-how-cfa9ff2e07e9

 

Node.js is Single-Threaded But Still Concurrent. How?

If your web server keeps getting client request and the main thread of your host machine serves them directly, the main thread will be…

blog.stackademic.com

 

300x250
728x90