# node.js의 쓰레딩 관련 오개념



## node.js의 쓰레드 처리

노드 js는 다른 서버 프로그램과 마찬가지로 여러개의 쓰레드를 사용하지만, worker 모듈 같은 것을 쓰지 않는 이상 자바스크립트 코드는 한 개의 쓰레드에서만 실행될 수 있습니다.

비동기 함수를 사용하거나 `Promise.all`을 사용해도 마찬가지이며, 이 특징 때문에 node.js는 연산이 많은 js 코드를 효율적으로 처리하지 못합니다.
그래서 이미지 처리처럼 연산이 많이 필요한 작업은 네이티브 모듈을 사용하는데요, 이러면 다른 쓰레드에서 연산을 수행할 수 있습니다.
이 경우에 js와 네이티브 interop이 가능한데요, 이 경우에도 모든 자바스크립트 코드는 메인 쓰레드에서 실행됩니다.
단, node js 프로세스를 내부적으로 새로 만드는 경우 해당 프로세스의 메인 쓰레드와 현재 쓰레드의 메인 쓰레드는 각각 자바스크립트 코드를 처리합니다.

## 블로킹

`fs`의 `readFileSync` 같은 함수는 **시스템 콜**을 수행하는 동안 js 쓰레드를 점유하여 js 코드의 실행을 막습니다.
반면, `fs`의 `readFile` 같은 경우 다른 쓰레드에서 **시스템 콜** 을 수행하며 실행이 끝난 후 js 코드를 **js 쓰레드에서** 호출합니다.

하지만 모든 무거운 동작이 다른 쓰레드에서 처리되는 건 아닙니다.
예를 들어 자바스크립트 코드에서 엄청 큰 루프를 돌면, 그 작업을 수행하는 동안 js 쓰레드는 다른 작업을 수행할 수 없습니다.

