-
이벤트 기반
이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
- 이벤트의 예 : 클릭, 네트워크 요청, 타이머 등
- 이벤트 리스너 : 이벤트를 등록하는 함수
- 콜백 함수 : 이벤트가 발생했을 때 실행될 함수
논블로킹 I/O
오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 나중에 오래 걸리는 함수를 실행하는 것.
- 논 블로킹 방식 하에서 일부 코드는 백그라운드에서 병렬로 실행된다.
- 일부 코드 : I/O 작업(파일 시스템 접근, 네트워크 요청), 압축, 암호화 등
- 나머지 코드는 블로킹 방식으로 실행된다.
- I/O 작업이 많을 때 노드 활용성이 극대화 된다.
프로세스 vs 스레드
프로세스와 스레드
- 프로세스 : 운영체제에서 할당하는 작업의 단위, 프로세스 간 자원 공유 X
- 스레드 : 프로세스 내에서 실행되는 작업의 단위, 부모 프로세스 자원 공유
노드 프로세스는 멀티 스레드이지만 직접 다룰 수 있는 스레드는 하나이기 때문에 싱글 스레드라고 표현한다.
노드는 주로 멀티 스레드 대신 멀티 프로세스를 활용한다. (14버전부터)
싱글 스레드
싱글 스레드라 주어진 일을 하나밖에 처리하지 못한다.
- 블로킹이 발생하는 경우 나머지 작업은 모두 대기해야 한다. -> 비효율적이다.
주방에 비유(점원 : 스레드, 주문 : 요청, 서빙 : 응답)
스레드 하나는 CPU 코어를 하나 사용한다. 즉, 코어가 아무리 많은 CPU라도 싱글 스레드환경에서 작업을 하면 결국 쓰게되는 코어는 1개란 뜻이다.
멀티 스레드
싱글 스레드 모델은 에러를 처리하지 못하는 경우 멈춘다.
- 프로그래밍 난이도가 쉽고, CPU, 메모리 자원을 적게 사용한다.
멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복한다.
- 단, 새로운 스레드 생성이나 놀고 있는 스레드 처리에 비용 발생
- 프로그래밍 난이도가 어렵다.
- 스레드 수만큼 자원을 많이 사용한다.
싱글 스레드와 같은 비유를 해보면 다음과 같다
효율이 당연히 싱글 스레드보다 더 좋다.
노드의 싱글 스레드
논 블로킹 모델을 채택하여 일부 코드(I/O)를 백그라운드 (다른 프로세스)에서 실행 가능하게 했다.
- 요청을 먼저 받고, 완료될 때 응답함
- I/O 관련 코드가 아닌 경우 싱글 스레드, 블로킹 모델과 같아진다.
멀티 스레드의 활용
노드 14버전 부터는
- 멀티 스레드를 사용할 수 있도록 worker_threads 모듈을 도입했다.
- CPU를 많이 사용하는 작업인 경우에 활용 가능하다.
- 멀티 프로세싱만 가능했던 아쉬움을 달래준다.
'노드' 카테고리의 다른 글
노드 exports, this, require, 순환참조 (0) 2023.04.11 노드 CommonJS 모듈 시스템 (0) 2023.04.11 REPL (0) 2023.04.11 서버로서의 노드 (0) 2023.04.11 노드의 정의 (0) 2023.04.11