Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.
위키백과, Node.js
Non-blocking I/O, 단일 스레드(싱글 스레드), 이벤트 루프 ...?
등의 난해한 말이 있는데 이번에는 싱글 스레드에 집중해서 살펴보도록 하겠다.
스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
위키백과, 스레드(컴퓨팅)
이 문장만으로 스레드를 이해하기에는 힘들 것 같아서 키워드를 정하고, 각 키워드에 대한 정의를 살펴보면서 스레드를 이해해보도록 하자!
Keyword
1. 프로그램
2. 프로세스
3. 스레드
컴퓨터에서 실행될 때 특정 작업(specific task)을 수행하는 일련의 명령어들의 모음(집합체)이다. 특정 문제를 해결하기 위해 처리 방법과 순서를 기술하여 컴퓨터에 입력되는 일련의 명령문 집합체이며 대부분의 프로그램은 실행 중(즉, 명령어를 '불러들일' 때)에 사용자의 입력에 반응하도록 구현된 일련의 명령어들로 구성되어 있다.
위키백과, 컴퓨터 프로그램
-> 요약하면, 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 정적인 상태의 파일이라고 볼 수 있다.
프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다.
위키백과, 프로세스
-> 프로세스는 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭한다. 예를 들어, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 실행된다.
Windows에서 작업관리자(ctrl + alt + delete)를 누르면 현재 진행중인 프로세스의 목록을 볼 수 있다.
-> 멀티 프로세스의 도식화
스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
위키백과, 스레드(컴퓨팅)
싱글 스레드
하나의 프로세스에서 하나의 스레드 실행
하나의 레지스터와 스택으로 표현
-> 레지스터 : CPU 내부의 저장장치
-> 스택 : 레지스터 집합에 존재하는 저장장치 (LIFO)
멀티 스레드
프로세스를 다수의 실행 단위로 나누어 실행
프로세스 내에서 자원을 공유하여 자원 생성과 관리의 중복을 최소화
각각의 스레드가 고유의 레지스터와 스택을 사용
결론부터 말하면, node.js는 싱글 스레드를 가지고 있다. 그러나 자바스크립트를 실행하는 스레드는 단 하나이므로 Node를 싱글스레드라고 한다. 그리고 그 싱글스레드가 바로 이벤트 루프이다.
자세한 설명
자바스크립트 엔진은 Memory Heap과 Call stack으로 이루어져 있는데, 자바스크립트 엔진 자체는 콜스택에 쌓인 실행 컨텍스트에 따라 위에서부터 차례로 실행이 일어나는 곳이기 때문에 비동기 처리를 할 수 없다. 따라서 비동기 처리가 필요하게 될 경우, Node api를 통해 libuv 라이브러리에서 제공하는 비동기처리를 하게 된다.
Node.js는 싱글스레드 논블로킹 모델로 구성되어 있다. 하나의 스레드로 동작하지만, 비동기 I/O 작업을 통해 요청들을 서로 블로킹하지 않는 것이다. 즉, 동시에 많은 요청들을 비동기로 수행함으로써 싱글스레드일지라도 논블로킹이 가능하도록 구성할 수 있는 것이다.