프로세스: 메모리에 올라와 실행되고 있는 프로그램의 인스턴스. 실행되고 있는 프로그램(독립적인 개체).
스레드: 프로세스 내에서 할당받은 실행의 단위. 스레드는 프로세스 당 CPU의 코어 개수만큼 생성될 수 있습니다.
논블로킹이란 이전작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻합니디.
블로킹보다 논블로킹 방식이 같은 작업을 더 짧은 시간 동안 처리할 수 있음을 알 수 있습니다. 하지만 싱글 스레드라는 한계 때문에 자바스크립트의 모든 코드가 이 방식으로 시긴적 이득을 볼 수 있는 것은 아닙니다. 현재 노드프로세스 외의 다른 컴퓨텅 자원을 사용할 수 있는 I/O 작업이 주로 시간적 이득을 많이 봅니다.
멀티 스레드 방식은 복잡한 동기화 문제가 골칫거리 였음. 동기화 모델이나 락에 대해 학습해야 하고 쓰기가 상당히 어려워 생산성 저하로 이어짐. Tomcat,JBoss와 같은 웹애플리케이션 서버나 Apache와 같은 일반적인 웹서버는 Multi Process 또는 Multi Thread의 형태를 가지고 있다.
톰캣과 같은 서버는 위의 그림과 같이 Client에서부터 요청이 오면, Thread를 미리 만들어 놓은 Thread Pool에서 Thread를 꺼내서 Client의 요청을 처리하게 하고, 요청이 끝나면 Thread Pool로 돌려보낸 후, 다른 요청이 오면 다시 꺼내서 요청을 처리하게 하는 구조이다. 동시에 서비스 할 수 있는 Client의 수는 Thread Pool의 Thread 수와 같은데,물리적으로 생성할 수 있는 Thread의 수는 한계가 있다. 즉 동시에 처리할 수 있는 Client 수에 한계가 있다.
또한 IO 효율면에서도 보면, 아래 그림과 같이 Client에 할당된 Thread는 IO 작업 (DB,Network,File)이 있을 경우 IO 호출을 해놓고, Thread는 CPU를 사용하지 않는 Wait상태로 빠져 버리게 된다.
이런 문제를 해결 하기 위한 것이 Single Thread 기반의 비동기 서버인데, 하나의 Thread만을 사용해서 여러 Client로부터 오는 Request를 처리한다. 단, IO 작업이 있을 경우 앞에서 설명한 비동기 IO방식으로 IO 요청을 던져놓고, 다시 돌아와서 다른 작업을 하다가 IO 작업이 끝나면 이벤트를 받아서 처리하는 구조이다.
아래 그림에서 처럼, Client A가 요청을 받으면, CPU 작업을 먼저하다가 IO작업을 던져놓고, Client B에서 요청이 오면, CPU작업을 하다가 IO작업을 던져놓고, Client A의 IO작업이 끝나면 이를 받아서 Client A에 리턴하는 식의 구조이다. IO작업시 기다리지 않기 때문에(Block 되지 않기 때문에), 하나의 Thread가 다른 요청을 받아서 작업을 처리할 수 있는 구조가 된다. 이 요청을 받아서 처리하는 Thread를 ELP (Event Loop Thread)라고 한다.
Event Loop는 Single-Thread 기반에서 비동기 메시지를 처리합니다. 이러한 Event Loop는 고성능의 병렬처리를 보장하도록 설계되어 있습니다. 따라서 이벤트에 의해 처리해야 할 단위 작업이 아주 짧은 시간 안에 처리된다면 Node.js의 고성능의 장점을 극대화 할 수 있습니다. 만일 처리 작업이 CPU를 많이 소모한다든지 대용량 파일을 처리하는 작업이라면 Node.js 는 독약과도 같습니다. 그러나 IO 작업이 별로 없는 애플리케이션이나 단위작업이 짧은 메시징 애플리케이션의 경우에는 Node.js는 고성능을 보장해 줍니다.