Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

melius

[Node.js] JavaScript Runtime Environment 본문

Node.js

[Node.js] JavaScript Runtime Environment

melius102 2021. 2. 27. 07:14

https://nodejs.org

https://nodejs.dev/learn

https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick

https://nodejs.org/en/docs/guides/dont-block-the-event-loop

1. JavaScript Runtime Environment

Node.js는 비동기 이벤트 기반(Asynchronous Event-driven) JavaScript 런타임 환경(Runtime Environment)이다. 런타임 환경은 특정 언어로 작성된 코드를 실행할 수 있는 실행환경으로, C/C++은 OS를 실행환경으로 볼 수 있으며 OS에 따라 실행되는 코드가 다르다. Java의 JRE는 JVM를 이용하여 OS가 달라도 실행되는 코드는 같다. 브라우저도 JavaScript 런타임 환경이다.

 

2. 주요 구성

1) V8 [https://v8.dev]

Chrome 브라우저의 JavaScript Engine으로 개발된 C++ 라이브러리로서, Node.js에서도 JavaScript Engine으로 사용되고 있다. JavaScript는 일반적으로 Interpreted Language로 분류되었다. 하지만 2009년, SpiderMonkey JavaScript Compiler가 Firefox 3.5가 적용된 이후, 더이상 Interpreted Language가 아니다. V8도 실행속도를 향상시키기 위해 Just-in-time (JIT) Compilation을 수행한다.

 

2) libuv [https://libuv.org]

Node.js에서 이벤트 루프, 워커 스레드, 비동기 I/O 작업 등을 구현하기 위해서 개발된 C 라이브러리이다. Luvit(Lua), Julia, pyuv(Python) 등에도 비동기 I/O 작업을 위해 사용되고 있다.

 

3. 특징

1) Single Thread

Node.js는 기본적으로 Single Thread로 동작하는 환경이다.

 

[Process vs Thread]

프로세스는 운영체제에서 할당하는 작업의 단위이며, 실행된 프로그램으로 프로세스간 자원(메모리)를 공유하지 않는다.

스레드는 프로세스내에서 생성되는 실행흐름의 단위이며, 멀티코어 CPU에서 각 스레드는 각 코어에서 동시에 실행되어 실행속도가 빠르다. 하나의 프로세스내의 스레드간은 자원을 공유한다.

 

[Call Stack]

프로그램에서 현재 실행 중인 서브루틴에 관한 정보를 저장하는 스택 자료구조이며 LIFO이다.

함수가 호출되면 Call Stack에 추가되고, 호출된 함수가 종료되면 Call Stack에서 제거된다.

각 스레드마다 Call Stack이 존재한다.

 

{main(), global context} - {first()} - {second()}

* 실행 컨텍스트(Execution context): JS 함수가 호출될때 실행되는 환경

 

 

2) Event-driven

Single Thread의 단점을 극복하기 위해서 이벤트 기반 비동기 I/O로 구현되었다.

 

- 비동기 작업을 수행하기 전에, 이벤트 핸들러를 등록한다.

- 백그라운드에서 해당작업을 수행한다. (Worker Pool??)

- 작업이 완료되면 이벤트가 발생되고 이벤트 핸들러를 [태스크 큐]에 넣는다.

- 호출 스택이 비면, [이벤트 루프]는 정해진 룰에 따라 큐에서 이벤트 핸들러를 빼내어 실행한다.

 

[태스크 큐] (공식명칭??)

이벤트 발생후 호출되어야할 콜백 함수들이 대기하는 곳

태스크 큐는 실제로 여러개의 큐로 이루어져 있다.

 

[이벤트 루프]

이벤트 발생시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서 결정

이벤트 루프는 호출스택이 비면, 태스크 큐에서 콜백함수를 호출한다.

이벤트 루프는 여러개의 태스크 큐에서 정해진 규칙에 따라 콜백 함수들을 호출스택에 부른다.

 

 

3) Non-blocking I/O

I/O 작업을 백그라운드에서 실행하게 하고, 작업 완료시에 이벤트 발생 (Non-Blocking)

노드 프로세스 외의 다른 컴퓨팅 자원을 사용할 수 있는 I/O 작업이 이 방식으로 이루져 있다.

(파일 시스템, 네트워크 등)

 

 

 

고민...

* a single process, without creating a new thread for every request ???

메인 스레드는 계산보다 교통정리용도로 쓰이고, Non-blocking I/O 작업이 많은 적용처에 적합.

안정적인 서빙을 위해서 nginx(로드 발란싱) 사용해야한다. 왜??

백그라운드 작업은 멀티 스레드 작업인가???

 

 

 

https://malgogi-developer.tistory.com/16

https://sjh836.tistory.com/149?category=710138

 

 

'Node.js' 카테고리의 다른 글

[Node.js] Package manager  (0) 2021.03.20
[Node.js] Addons  (0) 2021.03.08
[Node.js] Worker Threads  (0) 2020.02.04
[Node.js] FormData 객체 전송  (0) 2020.01.29
[Node.js] HTTPS 로컬 서버 구축  (0) 2020.01.29
Comments