great_park
great_park
great_park
전체 방문자
오늘
어제
05-10 10:54
  • 분류 전체보기 (124)
    • Computer Science (48)
      • Database (9)
      • Operating System (8)
      • Computer Network (0)
      • Computer Architecture (9)
      • Cloud computing (9)
      • Algorithm (13)
    • Algorithm PS (62)
      • DFS & BFS (21)
      • Floyd-Warshall (1)
      • Dijkstra (0)
      • Divide and Conquer (0)
      • Dynamic Programing (22)
      • Greedy (0)
      • BackTracking (11)
      • Binary Search (6)
      • Brute Force (0)
      • Sorting (0)
      • Stack & Queue (1)
      • Number Theory (0)
    • 기타 (12)
      • AWS (3)
      • Docker (1)
      • 기타 (8)
    • 2023 Google Solution Challenge (1)

최근 글

인기 글

블로그 메뉴

  • 홈
  • 태그
  • 방명록
반응형

태그

  • operating system
  • backtracking
  • Docker
  • mysql
  • BOJ
  • dfs
  • DeadLock
  • Binarysearch
  • Binary Search
  • pub/sub
  • Computer Architecture
  • BFS
  • Database
  • php
  • LIS
  • Single-Cycle Datapath
  • dp
  • Node.js
  • cloud computing
  • 알고리즘
hELLO · Designed By 정상우.
great_park
기타/기타

Node.js 기본 개념 및 동작 원리

Node.js 기본 개념 및 동작 원리
기타/기타

Node.js 기본 개념 및 동작 원리

2021. 9. 26. 16:37
반응형

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번을 다시 살펴보면,

  1. 호출 스택에 들어간 순서와 반대로 실행되므로, setTimeout이 먼저 실행된다
  2. 타이머와 함께 run 콜백을 백그라운드로 보내고, setTimeout은 호출 스택에서 빠진다.
  3. 남아있던 anonymous가 호출 스택에서 빠지고, 백그라운드에서는 3초를 센 후 run 함수를 태스크 큐로 보낸다.

    이벤트 루프가 run콜백을 태스크 큐에서 꺼내 호출 스택으로 올린 상황
  4. 이벤트 루프는 호출 스택이 비어 있으면 태스크 큐에서 함수를 하나씩 가져와 호출 스택에 넣고 실행한다.

  1. run이 실행된다.
  2. 호출 스택에서 run이 빠진다.
  3. 이벤트 루프는 태스크 큐에 콜백이 들어올 때까지 대기한다.

만약 호출 스택에 함수들이 너무 많이 들어있으면 3초가 지난 후에도 run 함수가 실행되지 않을수도 있다.

1.1.4 논 블로킹 I/O

작업은 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업으로 구분된다. 기본적으로 자바스크립트 코드는 동시에 실행될 수 없지만, 자바스크립트상에서 돌아가는 것이 아닌 I/O작업 같은 것은 동시에 처리될 수 있다.

  • I/O : 입력(input)과 출력(output)을 의미. 파일 시스템 접근(파일 읽기, 쓰기, 폴더 만들기)나 네트워크를 통한 요청도 I/O의 일종

이러한 작업을 할 때 노드는 논 블로킹 방식으로 처리한다. I/O작업을 백그라운드로 넘겨 동시에 처리하곤 한다. 따라서 동시에 처리될 수 있는 작업들은 최대한 묶어서 백그라운드로 넘겨야 시간을 절약할 수 있다.

  • 논 블로킹 : 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함을 의미

1.1.5 싱글 스레드

스레드와 프로세스

  • 프로세스 : 운영체제에서 할당하는 작업의 단위. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.
  • 스레드 : 프로세스 내에서 실행되는 흐름의 단위. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유하며 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.
  1. 노드를 실행하면 먼저 프로세스가 하나 생성된다.
  2. 그 프로세스에서 스레드들을 생성하는데, 내부적으로 스레드를 여러 개 생성한다.
  3. 하지만 우리가 직접 제어할 수 있는 스레드는 하나뿐이다.
    따라서 노드를 싱글 스레드라고 여겨지는 것이며, 엄밀히 말하면 싱글 스레드로 동작하지는 않는 것이다.

노드가 싱글 스레드로 동작하지 않는 두 가지 경우

  1. 스레드풀
    스레드가 생설될 때 운영체제가 메모리공간을 확보해주고 그 메모리를 스레드에게 할당해준다. 요청이 들어올 때 마다 스레드를 생성하고 일을 다하면 수거하는 작업에 대한 비용을 절약하기 위해서 스레드를 미리 만들어 놓는 것을 의미한다.
    스레드풀을 사용하는 모듈에는 crypto, zlib, dns.lookup 등이 있다.
  2. 워커 스레드
    CPU 작업이 많은 경우 직접 다수의 스레드를 다룰 수 있는 워커 스레드를 사용한다.
    참고 : https://codingcoding.tistory.com/1310

1.2 서버로서의 노드

  • 노드의 장점
  1. 멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용
  2. I/O 작업이 많은 서버로 적합
  3. 멀티 스레드 방식보다 쉬움
  4. 웹 서버가 내장되어 있음
  5. 자바스크립트를 사용함
  6. JSON 형식과 쉽게 호환됨
  • 노드의 단점
  1. 기본적으로 싱글 스레드라서 CPU 코어를 하나만 사용
  2. CPU 작업이 많은 서버로는 부적합
  3. 하나뿐인 스레드가 멈추지 않도록 관리가 필요함
  4. 서버 규모가 커졌을 때 서버를 관리하기 어려움
  5. 어중간한 성능참고

https://jamong-icetea.tistory.com/237

반응형

'기타 > 기타' 카테고리의 다른 글

서버 구축 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
  • 1.1.1 서버
  • 1.1.2 자바스크립트 런타임
  • 1.1.3 이벤트 기반
  • 1.1.4 논 블로킹 I/O
  • 1.1.5 싱글 스레드
  • 1.2 서버로서의 노드
'기타/기타' 카테고리의 다른 글
  • 서버 구축 routine
  • Non Functional Testing, node.js 환경에서 실습 with "Artillery"
  • 서브 도메인 설정 및 리다이렉션
  • 도메인 설정 및 HTTPS 적용
great_park
great_park
GitHub : https://github.com/great-park

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.