Blocking-Multi-thread(Blocking Multi Thread)

- web server가Blocking i/o를 사용할 경우 싱글스레드일 때 긴 i/o작업동안 다른 요청이 대기해야하므로 요청마다 thread pool에 미리 생성해놓은 thread를 할당한다.
- 이 방식의 단점은
- 각 스레드는 blocking i/o시 cpu를 점유한상태로 대기하는 시간이 존재하게 되고 이는 성능 저하로 이어진다.
- 스레드를 많이 생성해야하므로 메모리를 많이 사용하게 된다.
- context switching이 상대적으로 많이 일어날 수 있다.
Non-Blocking-Single-thread(Node.js)

- Node.js는 Non-blocking I/O, event-driven 기술이다.
- 이 때문에 Single thread만으로 실행될 수 있으며 blocking 작업이나 너무 시간이 오래걸리는 cpu 연산은 lidev thread pool에 넘기고 종료시 event 발생 신호를 원래 main Single Thread로 주게게 함으로서 Asynchronous하게 실행할 수 있다.
- event기반과 Non-blocking, Asy I/o
Event Queue
- 특정 요청이 도달하거나 lidev thread 에서 실행된 blocking i/o가 종료되면 event queue에 추가된다.
Event Loop
- Node.js의 single thread를 event loop라고 한다.
- event loop는 event queue 에서 값을 순차적으로 꺼내어 처리하는 역할을 한다.
- 만약 event queue에서 꺼낸 요청이 non-blocking i/o를 요구하면 event loop내에서 처리하고
- 요청을 처리하는 과정에서 i/o, network 통신등의 시간이 오래걸리면서 cpu자원을 크게 소모 하는 Blocking I/O들은 libuv에서 생성한 thread pool로 넘겨서 처리하게 한다.
- thread pool에 넘긴 작업이 종료하게 되면 Event Queue에 담기게 되고 이를 Event Loop에서 꺼낼때 thread pool에 작업을 넘겨줄때 지정해 주었던 call back function을 Event Loop에서 실행하게 된다.
장점
- 싱글스레드인 event loop만으로도 여러 요청을 asynchronous방식으로 처리할 수 있고 multithread blocking 일때 처럼 blocking i/o 작업때문에 cpu 가 비효율적으로 사용될일이 매우 줄어듬.