Keyword : 런타임, 이벤트 기반, 논 블로킹, I/O, 싱글 스레드 모델, 스레드풀 워커 스레드
1.1.1 서버
Node.js는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임이다.
즉, Node.js는 프레임워크가 아니며 Javascript의 실행환경일 뿐이고, 서버 어플리케이션을 실행하는 데 제일 많이 사용되는 것이다.
- 서버는 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 or 프로그램을 의미
Node.js는 Javascript 프로그램이 서버로서 기능하기 위한 도구를 제공함으로써 클라이언트의 request에 대한 response를 전달하는 서버의 역할을 수행할 수 있는 것이다.
1.1.2 자바스크립트 런타임
- 런타임 : 특정 언어로 만든 프로그램들을 실행할 수 있는 환경
libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.
1.1.3 이벤트 기반
- 이벤트 기반: 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
이벤트 기반 시스템에서는 특정 이벤트(ex 클릭, 네트워크 요청)가 발생할 때 무엇을 할지 미리 등록해야 하는데, 이를 이벤트 리스너에 콜백함수를 등록한다고 표현한다. 따라서 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출하고, 발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면, 노드는 다음 이벤트가 발생할 때까지 대기한다.
- 이벤트 루프 : 이벤트 발생시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당
노드는 자바스크립트 코드의 맨 위부터 한 줄씩 실행하는데, 함수 호출 부분에서 함수를 호출 스택(call stack)에 넣는다.
Ex1)
function first() {
second();
console.log('첫 번째');
}
function second(){
third();
console.log('두 번째');
}
function thrid() {
console.log('세 번쨰');
}
// 함수 호출
first();
anonymous는 처음 실행 시의 전역 컨텍스트(global context)를 의미한다.
- 컨텍스트 : 함수가 호출되었을 때 생성되는 환경
함수는 실행되는 동안 호출 스택에 머물러 있다가 실행이 완료되면 호출 스택에서 지워진다. 스택에 쌓이는 순서와 반대로 맨 위에서 부터 실행되므로 출력 결과는 다음과 같을 것이다.
세 번째
두 번째
첫 번째
Ex2)
function run() {
console.log('3초 후 실행');
}
console.log('시작');
setTimeout(run, 3000);
console.log('끝');
출력 결과
시작
끝
3초 후 실행
- 백그라운드 : 이벤트 리스너들이 대기하는 곳. 여러 작업이 동시에 실행될 수 있다.
- 태스크 큐 : 이벤트 발생 후, 백그라운드에세는 태스크 큐로 이벤트 리스너의 콜백함수를 보낸다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부른다.
예시 2번을 다시 살펴보면,
- 호출 스택에 들어간 순서와 반대로 실행되므로, setTimeout이 먼저 실행된다
- 타이머와 함께 run 콜백을 백그라운드로 보내고, setTimeout은 호출 스택에서 빠진다.
- 남아있던 anonymous가 호출 스택에서 빠지고, 백그라운드에서는 3초를 센 후 run 함수를 태스크 큐로 보낸다.
이벤트 루프가 run콜백을 태스크 큐에서 꺼내 호출 스택으로 올린 상황 - 이벤트 루프는 호출 스택이 비어 있으면 태스크 큐에서 함수를 하나씩 가져와 호출 스택에 넣고 실행한다.
- run이 실행된다.
- 호출 스택에서 run이 빠진다.
- 이벤트 루프는 태스크 큐에 콜백이 들어올 때까지 대기한다.
만약 호출 스택에 함수들이 너무 많이 들어있으면 3초가 지난 후에도 run 함수가 실행되지 않을수도 있다.
1.1.4 논 블로킹 I/O
작업은 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업으로 구분된다. 기본적으로 자바스크립트 코드는 동시에 실행될 수 없지만, 자바스크립트상에서 돌아가는 것이 아닌 I/O작업 같은 것은 동시에 처리될 수 있다.
- I/O : 입력(input)과 출력(output)을 의미. 파일 시스템 접근(파일 읽기, 쓰기, 폴더 만들기)나 네트워크를 통한 요청도 I/O의 일종
이러한 작업을 할 때 노드는 논 블로킹 방식으로 처리한다. I/O작업을 백그라운드로 넘겨 동시에 처리하곤 한다. 따라서 동시에 처리될 수 있는 작업들은 최대한 묶어서 백그라운드로 넘겨야 시간을 절약할 수 있다.
- 논 블로킹 : 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함을 의미
1.1.5 싱글 스레드
- 프로세스 : 운영체제에서 할당하는 작업의 단위. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.
- 스레드 : 프로세스 내에서 실행되는 흐름의 단위. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유하며 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.
- 노드를 실행하면 먼저 프로세스가 하나 생성된다.
- 그 프로세스에서 스레드들을 생성하는데, 내부적으로 스레드를 여러 개 생성한다.
- 하지만 우리가 직접 제어할 수 있는 스레드는 하나뿐이다.
따라서 노드를 싱글 스레드라고 여겨지는 것이며, 엄밀히 말하면 싱글 스레드로 동작하지는 않는 것이다.
노드가 싱글 스레드로 동작하지 않는 두 가지 경우
- 스레드풀
스레드가 생설될 때 운영체제가 메모리공간을 확보해주고 그 메모리를 스레드에게 할당해준다. 요청이 들어올 때 마다 스레드를 생성하고 일을 다하면 수거하는 작업에 대한 비용을 절약하기 위해서 스레드를 미리 만들어 놓는 것을 의미한다.
스레드풀을 사용하는 모듈에는 crypto, zlib, dns.lookup 등이 있다. - 워커 스레드
CPU 작업이 많은 경우 직접 다수의 스레드를 다룰 수 있는 워커 스레드를 사용한다.
참고 : https://codingcoding.tistory.com/1310
1.2 서버로서의 노드
- 노드의 장점
- 멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용
- I/O 작업이 많은 서버로 적합
- 멀티 스레드 방식보다 쉬움
- 웹 서버가 내장되어 있음
- 자바스크립트를 사용함
- JSON 형식과 쉽게 호환됨
- 노드의 단점
- 기본적으로 싱글 스레드라서 CPU 코어를 하나만 사용
- CPU 작업이 많은 서버로는 부적합
- 하나뿐인 스레드가 멈추지 않도록 관리가 필요함
- 서버 규모가 커졌을 때 서버를 관리하기 어려움
- 어중간한 성능참고
'기타 > 기타' 카테고리의 다른 글
서버 구축 routine (0) | 2022.08.12 |
---|---|
Non Functional Testing, node.js 환경에서 실습 with "Artillery" (0) | 2022.05.17 |
서브 도메인 설정 및 리다이렉션 (0) | 2021.07.04 |
도메인 설정 및 HTTPS 적용 (0) | 2021.07.04 |
MySQL 외부 접속 허용 및 phpMyAdmin 설치 (0) | 2021.07.04 |