220905(월)
공부한 내용
- NodeJS 교과서 1장(노드 시작하기)
- 런타임과 노드 내부 구조
- 이벤트 기반(event-driven) / 논 블로킹
- 싱글 스레드
- 서버로서의 노드 개념
1. 런타임과 노드 내부 구조
런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 의미한다.
노드는 자바스크립트 런타임으로서, 자바스크립트 실행기 역할을 한다.
노드 내부 구조는 Node.js Core Library >> Node.js Bindings >> (라이브러리)V8 & libuv로 구성된다.
V8은 오픈 소스 자바스크립트 엔진 / libuv는 비동기 I/O로서, 이벤트 기반, 논 블로킹 I/O 모델을 구현한다.
2. 이벤트 기반(event-driven) / 논 블로킹
이벤트 발생시 미리 지정한 작업을 수행하는 방식
EX)이벤트 리스너에 콜백 함수 등록 >> 시스템에서 이벤트 발생 >> 이벤트 리스너에 등록된 콜백 함수 호출(호출 스택의 방식을 따르며, 전역 컨텍스트로서 anonymous 함수가 처음으로 쌓인다. *컨텍스트 = 함수 호출시 생성되는 환경)
이벤트 루프
Ex) 호출 스택에 setTimeout() 함수가 쌓임 >> setTimeout 실행 시 콜백 run을 백그라운드에 보냄 >> 백그라운드에 타이머 3초 이후 태스크 큐로 run 이동. >> anonymous 함수까지 실행되어 호출 스택이 비면, 이벤트 루프가 태스트 큐의 콜백(run)을 호출 스택으로 올린다. >> 다시 run이 호출 스택에서 실행되어 비워지고, 이벤트 루프는 테스트 큐에 콜백이 들어올 때까지 대기한다.
setTimeout() 같은 콜백 함수를 사용하여, 함수가 실행되는데에 오래 걸리더라도, 우선 스택 순서에 따라 실행시켜서. 블로킹(작업이 동시에 여러개가 이루어지지 않음)인 Node가 논 블로킹인 것처럼 작동하게 한다.(Ex) setTimeout(콜백 , 0) / 논 블로킹 != 동시
3. 싱글 스레드
스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 또한 프로세스는 운영체제에서 할당하는 작업의 단위이다. 이 때, 프로세스의 경우 프로세스 간에 메모리 등의 자원을 공유하지 않지만. 스레드의 경우 같은 부모 프로세스의 자원을 다른 스레드와 공유한다.
Node.js는 싱글 스레드가 아니지만, 제어할 수 있는 스레드는 하나이기 때문에. 싱글 스레드라고 여긴다. 싱글 스레드 논 블로킹 방식을 사용하는 데, 즉, 하나의 스레드가 여러 작업을 동시에 수행하는 방식이다. (*멀티 스레드 방식은 프로그래밍이 어렵고, CPU 작업이 많을 떄 사용한다. / 멀티 프로세싱 방식은 프로그래밍이 쉽고, I/O 요청이 많을 때 사용한다.
4. 서버로서의 노드의 개념
노드를 서버로 사용할 때에는 싱글 스레드, 논 블로킹 모델을 사용하므로.
장점으로는 멀티 스레드에 비해 적은 자원을 사용 / I/O 작업이 많은 서버 적합 / 멀티 스레드 방식보다 쉬움 / 웹 서버가 내장됨 / 자바스크립트 사용 / JSON 형식과 쉽게 호환
단점으로는 싱글 스레드라서 CPU 코어를 하나만 사용 / CPU 작업이 많은 서버로는 부적합 / 하나인 스레드가 멈추지 않도록 관리 필요 / 서버 규모가 커졌을 때 서버 관리 어려움