Node.js 노드 내부 구조
- 노드는 V8과 더불어 libuv라는 라이브러리를 사용
- V8, libuv는 C와 C++로 구현되어 있지만 따로 몰라도 노드 사용하는데 문제없음
- 대부분 Node.js가 싱글스레드라고 말하는 이유는 V8엔진(자바스크립트 엔진)을 사용하기 때문
- libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있음
libuv 라이브러리 특징이 곧 Node.js의 특징이 되므로 알아보자!
(이벤트 기반, 논 블로킹 I/O)
이벤트 기반
- 이벤트 기반이란? 이벤트(클릭, 네트워크 요청 등)가 발생할 때 미리 지정해둔 작업을 수행하는 방식
- 이벤트 기반 시스템에서는 특정 이벤트가 발생하기 전에 미리 등록을 해야하는데, 이를 이벤트 리스너에 콜백 함수를 등록한다라고 표현
ex) 버튼을 클릭할 때, 경고창을 띄우도록 설정한다 → 먼저 클릭 이벤트 리스너에 경고창을 띄우는 콜백 함수를 등록
- 노드도 이벤트가 발생하면 이벤트 리스너에 등록된 콜백 함수가 호출되는데, 발생한 이벤트가 없거나 이벤트를 다 처리하면 노드는 다음 이벤트가 발생할 때까지 대기
- 이벤트 루프(event loop)란? 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지 이벤트 루프가 판단
논 블로킹(Non-Blocking) I/O
- 논 블로킹이란? 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행(비동기 방식과 유사)
- 블로킹이란? 이전 작업이 끝나야만 다음 작업을 수행(동기 방식과 유사)
- 그림에서 알 수 있듯이 블로킹 방식보다 논 블로킹 방식이 같은 작업을 더 빠른 시간내에 처리할 수 있음
(다만 작업들이 모두 동시에 처리될 수 있는 작업이라는 전제)
- 동시에 처리가능한 작업이 존재하는 경우 작업 순서를 어떻게 하느냐에 따라 성능이 크게 달라질 수 있으므로 동시에 처리할 수 있는 I/O 작업은 논블로킹 방식으로 코딩하는 습관을 들이도록 해야함!
Node.js의 또 다른 특징인 싱글 스레드 !!
싱글스레드에 대해서도 알아보자!
싱글 스레드
- 싱글 스레드란? 스레드가 하나뿐인것을 의미(이는 곧 작성한 자바스크립트 코드가 동시에 실행될 수 없는 이유이기도 함)
- 프로세스란?
- 운영체제에서 할당하는 작업의 단위
- 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스
- 프로세스 간에는 메모리등의 자원을 공유하지 않음 - 스레드란?
- 프로세스 내에서 실행되는 흐름의 단위
- 프로세스는 스레드를 여러개 생성하여 여러 작업을 동시에 처리할 수 있음
- 스레드들은 부모 프로세스의 자원을 공유
- 같은 주소의 메모리에 접근이 가능하기 때문에 데이터를 공유할 수 있음
- 노드를 실행하면 하나의 프로세스가 생성 → 그 프로세스에서 내부적으로 스레드를 여러개 생성 → 이 중에서 직접 제어할 수 있는 스레드는 하나뿐 → 그래서 흔히 노드는 싱글 스레드라고 여겨지는 것! (따라서 엄밀히 말해 노드가 싱글 스레드로 동작하지는 않음)
- 노드가 싱글 스레드로 동작하지 않는 경우 : 스레드풀(Thread Pool), 워커 스레드(Worker Thread)
- 스레드풀이란?
- 노드가 특정 동작을 수행할 때 스스로 멀티 스레드를 사용
- 대표적인 예 : 암호화, 파일 입출력, 압축 등 - 워커 스레드란?
- 노드 12 버전에서 안정화된 기능으로 이제 노드에서도 멀티 스레드 사용이 가능
- 사용자가 직접 다수의 스레드 컨트롤이 가능
- CPU 작업(연산이 많은 작업)이 많은 경우에 워커 스레드를 사용하면 됨
Node.js 특징을 정리해보자
- 노드는 libuv 라이브러리로 되어 있어 이벤트 기반, 논 블로킹 방식이라는 특징을 가짐
- 노드는 내부적으로 스레드를 여러개 생성하지만 사용자가 하나의 스레드를 컨트롤 할 수 있으므로 싱글 스레드의 특징을 가짐. 노드 버전 12부터 멀티 스레드 사용이 가능!