프로세스는 운영체제에서 자원을 할당받은 작업의 단위이다. 프로세스는 다른 프로세스와 자원을 공유하지 않는다. (Node.js, 브라우저 등 프로그램은 하나의 프로세스이다.)
스레드는 프로세스 내 실행 흐름 단위이다. 스레드가 여러 개 생성되면 여러 작업을 동시에 처리할 수 있는 것이다. 같은 프로세스 내 스레드들은 서로 자원을 공유한다.
싱글 스레드는 말 그대로 스레드가 하나 뿐이다. 요청이 들어오면 한 번에 하나씩 처리한다. 사실 블로킹이 심하게 일어나는 작업이 아니라면 싱글 스레드로 충분하다. 블로킹이 심한 작업이라면 논 블로킹 방식으로 대기 시간을 최대한 줄인다.
멀티 스레드는 프로세스 내부에 다수의 스레드를 두어 자원을 공유하며 작업을 수행하는 것이다.
Node.js는 싱글 스레드?
Node.js는 실행되었을 때 스레드를 여러 개 생성한다. 하지만 우리가 직접 제어할 수 있는 스레드(=자바스크립트로 제어할 수 있는 스레드)는 하나뿐이다. 그래서 흔히 Node.js를 싱글 스레드라고 하는 것이다. 그리고 그 싱글 스레드가 바로 이벤트 루프이다.
블로킹은 이전 작업이 완료되어야만 다음 작업을 수행할 수 있는 것을 의미한다.
반대로 논 블로킹은 이전 작업의 완료와 상관 없이 대기하지 않고 다음 작업을 수행할 수 있음을 의미한다.
- 싱글 스레드 = 일손 하나
- 멀티 스레드 = 일손 여러 개
- 블로킹 = 한 번에 한 작업만 가능
- 논 블로킹 = 동시에 여러 작업 가능
일손이 한 개이며 동시에 여러명의 주문을 받지 못한다.
우선 주문이 들어왔다는 걸 주방에 알리고 그 다음 주문을 받는다. 주문 받은 순서와는 상관 없이 음식이 완료되는 순서로 서빙한다.
점원이 한 명이지만, 역량이 좋아 여러 주문을 한 번에 받을 수 있다. 하지만 주문이 한 번에 많이 들어오거나 오래 걸리는 요리라면 점원이 버거울 수 있다.
Node.js는 이 방식을 채택했다.
점원이 여러 명이고, 각각의 점원은 한 번에 한 주문만 받을 수 있다. 손님이 늘어나면 그만큼 점원이 많이 필요하고, 손님이 줄면 고용한 점원이 쉬게 된다. 점원을 추가 고용하거나 해고해야 하는 수고스러운 일이 발생하는 것이다.
멀티 스레드 + 논 블로킹으로 하면 되는 거 아냐?
우선 멀티 스레드는 비교적 프로그래밍이 어렵다. 그래서 프로세스를 여러 개 두는 멀티 프로세싱 방식을 대신해서 사용한다.