싱글 스레드란 스레드가 하나라는 의미입니다.
Node.js는 내부적으로 스레드가 여러 개 이지만 우리가 직접 제어할 수 있는 스레드는 하나뿐이기 때문에 싱글 스레드라 불립니다.
스레드를 이해하기 위해서는 프로세스 부터 알아야 합니다.
프로세스는 크롬 브라우저 VS Code와 같이 실행중인 프로그램을 의미합니다.
프로그램은 코드들이 모여있는 디렉토리라 볼 수 있고 프로세스는 그 코드들이 실행되어 메모리에 올라가 동작중인 것이라 볼 수 있습니다.
참고로 프로세스 간에는 데이터 공유가 되지않아 네트워크를 이용해 데이터를 공유합니다.
프로세스 내에서 실행되는 흐름의 단위 입니다.
스레드는 한 프로세스 내부에 적어도 한 개 이상 존재하게 됩니다.
프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있습니다.
스레드들은 부모 프로세스의 데이터를 공유합니다. (같은 주소의 메모리에 접근이 가능하기 때문)
Node.js는 싱글 스레드라 요청이 많이 들어와도 한 번에 하나씩 요청을 처리합니다.
Node.js는 싱글 스레드로 동작하지만 I/O 작업이 발생한 경우 libuv 라이브러리를 이용해 I/O 작업을 논 블로킹 방식으로 처리합니다.
블로킹이란 이전 작업이 끝날때까지 다음 작업을 막는 걸 의미합니다.
싱글 스레드 블로킹 모델은 점원이 한 명뿐인 카페라고 생각 할 수 있습니다.
이 점원은 주문을 받고 바로 커피를 만들어 다른 주문을 받지 않습니다.
그래서 손님들은 앞 손님의 커피가 나올때까지 기다렸다 주문을 해야 합니다.
이것이 싱글 스레드 블로킹 모델입니다.
싱글 스레드 논 블로킹 모델은 점원은 한 명뿐이지만 키오스크가 있는 카페라고 생각 할 수 있습니다.
이 점원은 주문은 키오스크에게 맡기고 커피 만드는 일에만 집중을 합니다.
그래서 손님들은 앞 손님의 커피를 기다릴 필요 없이 자신의 커피만 기다리면 됩니다.
아메리카노 같은 간단한 커피는 주문 순서와 상관이 없이 먼저 나올 수 있습니다.
이것이 싱글 스레드 논 블로킹 모델입니다.
이 방식은 Node.js가 채택하고 있는 방식입니다.
Input/Output 작업은 libuv 라이브러리에 맡기고 나머지 작업은 V8 엔진을 이용해 순차적으로 작업을 실행하게 됩니다.
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 것을 말합니다.
Node.js는 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출하게 되고 발생한 이벤트를 다 처리하게 되면 다음 이벤트가 발생할 때까지 대기합니다.
이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당합니다.
노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 부릅니다.
Node.js 이벤트 루프(Event Loop) 샅샅이 분석하기
Node.js 교과서 - 길벗
블로킹과 논블로킹 살펴보기 - nodejs.org