Node.js 코드에서 사용하는 컴포넌트와 개념

Node.js C++ Codebase 일부를 해석 및 요약하였다.

1. Isolate

하나의 JS 엔진 인스턴스, 특히 서로를 참조하는 JS 객체의 모음(=heap)이다. Node 인스턴스가 V8 API를 호출할 때 인자로 넘긴다. JS 엔진의 동작을 관리하고 현재 메모리 상태, 통계를 요청하는 API를 제공한다. V8 API는 명시적으로 특정하지 않는 한 thread-safe 하지 않다. 즉 전형적인 Node.js 앱에서 메인 스레드와 워커 스레드는 각각의 isolate 를 가지며 각 isolate의 객체는 다른 isolate의 객체를 참조할 수 없다.

2. Context

JS에서는 하나의 heap에 여러 개의 전역 객체와 JS내장 객체 모음이 함께 존재할 수 있으며, Node.js의 vm 모듈에서 이를 확인할 수 있다. V8 은 이들 각각의 전역 객체와 연관된 내장 객체들을 Context 로 참조한다.

현재 Node.js 에는 Enviroment 인스턴스의 주요 Realm에 연관된 하나의 main Context와 vm.Context로 생성되거나 ShadowRealm과 연관된 여러 개의 하위 Context 가 있다. 대부분의 Node.js 기능은 (MessagePort 객체를 제외하면) Realm에 연관된 Context 내부에서 동작한다. (이는 설계에 내재된 것이 아니므로 추후 바뀔 수 있다.) Context 는 예외처리에 종종 사용된다.

3. Event loop

uv_loop_t 스트럭트는 Node.js 내부의 event loop을 위한 주요 추상화 요소이다.

많은 경우 메인 및 워커 스레드, 그리고 Node.js 실행중 종종 생성되는 헬퍼 스레드는 각각 하나의 이벤트 루프를 사용한다. (이 또한 Node.js 설계에 내재된 내용은 아니므로 다른 스레드의 이벤트 루프를 실행가능하도록 바뀔 수도 있다.)

현재 이벤트 루프는 Environment객체에서 event_loop() 를 사용하여 접근가능하다.

4. Enviorment

Node.js 인스턴스를 표현하는 클래스이다.

현재 모든 Environment 클래스는 하나의 이벤트루프, 하나의 Isolate, 하나의 주(principal) Realm과 연관되어 있다.

Environment 클래스는 서로 다른 Realm 인스턴스 간 공유 가능한 내장 모듈들의 다양한 필드들을 포함한다. (예: async hooks info)

5. Realm

Realm 클래스는 특정 ECMAScript realm에 연관된 JS 객체와 함수 모음에 대한 "컨테이너"이다. 각각의 ECMAScript realm은 전역객체와 일련의 기본객체를 제공한다. 모든 Realm 인스턴스는 특정 Context를 위해 생성된다. 주(principal) Realm과 합성 Realm이 있다.

+ Recent posts