이 글의 내용은 노드가 js를 설명하고 실행하는 과정을 분석한 내용을 공유하기 위한 것입니다. 관심 있는 친구는 한 번 살펴보고, 필요한 친구도 참고할 수 있습니다.
설명: 노드는 단일 스레드입니다. , 비차단 및 이벤트 기반(커널의 udev 이벤트와 유사하며 수신 콜백 메커니즘을 참조할 수 있음)
node-v8.10.0을 객체로 사용, 주로 src/node_main.cc 및 2개의 파일 src/node.cc.
Entrance
node-v8.10.0/src/node_main.cc --> 90 int main(int argc, char *argv[])
호출 node::Start(argc, argv); 10.0/src/node.cc --> 4863 int Start(int argc, char** argv)
a: 4864 atexit([] () { uv_tty_reset_mode(); });
# *.js 실행 후 익명 함수가 실제로 uv_tty_reset_mode()를 실행 중입니다
b: 4865 PlatformInit();
# 인라인 함수 PlatformInit()를 실행하고 세마포 처리 함수를 등록합니다.
c: 4866 node::performance::performance_node_start = PERFORMANCE_NOW(); uv_hrtime 함수: src/node_perf_common.h: 13: #Define Performance_now () uv_hrtime ()
내보내기 정의: DEPS/UV/Include/UV.H: 1457: UV_EXTERN 4_t UV_HRTIME (VOID)
구현: DEPS/UV /src /unix/core.c:111:uint64_t uv_hrtime(void)
uv_hrtime은 uv__hrtime을 호출합니다
정의: deps/uv/src/unix/internal.h:252:uint64_t uv__hrtime(uv_clocktype_t type);
구현: deps/uv /src /unix/linux-Core.c:442:uint64_t UV__HRTIME (uv_clockType_t Type) {
Sti
: 노드 실행*.js 스크립트의 시작 시점을 기록합니다. ::performance::performance_v8_start = PERFORMANCE_NOW();
d: 4868 CHECK_GT(argc, 0);
src/util.h:129:#define CHECK_GT(a, b) CHECK((a) > (b))
사용 사용 사용 사용 사용 사용 통해 통해 통해 통해 통해 ‐ 통해 아웃 ‐ 구현:
f: 4877 Init(&argc, const_cast
4542 void Init(int* argc,
4543 const char** argv,
4544 int* exec_argc ,
4545 const char** * exec_argv) {
4617 ProcessArgv(argc, argv, exec_argc, exec_argv);
4502 ParseArgs(argc, argv, exec_argc, exec_argv, &v8_argc, &v8_argv, is _env);
4015 static void Par seArgs( int* argc,
매개변수 구문 분석
g: openssl 관련 구성
h: 4895 v8_platform.Initialize(v8_thread_pool_size, uv_default_loop());
i: 4902 V8::Initialize();
v8 초기화
j: 4905 const intexit_code =
4906 시작(uv_default_loop(), argc, argv, exec_argc, exec_argv);
k: 종료
4908 v8_platform.StopTracingAgent();
v8_initialized = false; 4911 V8::Dispose();
4919 v8_platform.Dispose();
4921 delete[] exec_argv ;
4922 exec_argv = nullptr;
4924 return exit_code;
2. 1의 j 부분을 분석합니다.
a: 4814 inline int Start(uv_loop_t* event_loop,
4815 int argc, const char* const* arg v,
4816 int exec_argc, const char* const* exec_argv) {
b: 4824 Isolate* const isolate = Isolate::New(params);
4828 isolate->AddMessageListener(OnMessage);
4829 격리->SetAbortOnUncaughtExceptionCallback(ShouldAbortOnUncaughtException) ;
4830 isolate->SetAutorunMicrotasks(false);
4831 isolate->SetFatalErrorHandler(OnFatalError);
new Isolate对象 ,并设置关参数。
c: 4843 int exit_code;
4844 {
4845 사물함 사물함(격리) ;
4846 Isolate::Scope isolate_scope(isolate);
4847 HandleScope handler_scope(isolate);
4848 IsolateData isolate_data(isolate, event_loop, allocator.zero_fill_field()) ;
4849 종료_코드 = 시작(isolate, &isolate_data, argc, argv, exec_argc, exec_argv);
4850 }
准备开始执行的参数,isolate对象。
d: 4745 inline int Start(Isolate* isolate, IsolateData* isolate _data,
4746 int argc, const char* const* argv,
4747 int exec_argc , const char* const* exec_argv) {
e: 环境准备
4748 HandleScope handler_scope(isolate);
4749 Local
4750 Context::Scope context_scope(context);
4751 환경 env(isolate_data, context);
4754 env.Start(argc, argv, exec_argc, _argv, v8_is_profiling);
执行代码 src/env.cc:18:void Environment::Start(int argc,
4771 LoadEnvironment(&env);
加载env
f: 다양한 이벤트가 있습니다.
3. 分析核心分
4777 {
4778 SealHandleScope seal(isolate);
4779 bool more;
4780 PERFORMANCE_MARK(&env, LOOP_START);
4781 do {
4782 uv_run(env.event_loop(), UV_RUN_DEFAULT);
4783 and )
4788 계속;
4789
4790 EmitBeforeExit(&env);
4791
4792 // 방출 ` beforeExit` 방출 후 루프가 활성화된 경우
4793 // 이벤트 또는 일부 콜백을 실행한 후.
4794 more = uv_loop_alive (env.event_loop ()) // 처리하지 않고 이벤트가 없는지 확인합니다. 일부 비동기 작업에는 콜백 함수가 있습니다.
4795 } while (more == true);
4796 PERFORMANCE_MARK(&env, LOOP_EXIT); // 이벤트 처리가 없으면 종료합니다.
4797 }
a: 이벤트 처리를 위한 핵심 함수 uv_run
선언: deps/uv/include/uv.h:281:UV_EXTERN int uv_run(uv_loop_t*, uv_run_mode mode);
구현: deps/uv/src/ unix/ core .c:348:int uv_run(uv_loop_t* loop, uv_run_mode mode) {
b: 루프가 활성 상태인지 확인합니다. 핸들이 있는지, 요청 신호가 있는지, 핸들이 닫히지 않았는지 확인합니다.
343 int uv_loop_alive(const uv_loop_t* loop) {
344 return uv__loop_alive(loop);
345 }
336 static int uv__loop_alive(const uv_loop_ t* loop) {
337 return uv__has_active_handles(loop) ||
3 38 uv__has_active_reqs(루프) |
339 loop->closing_handles != NULL;
340 }
c: uv__has_active_handles(loop):
deps/uv/src/uv-common.h:145:#define uv__has_active_handles(loop) 루프) ~ 129 # uv__has_active_reqs(루프) 정의
위 내용은 Node에서 js 실행 과정 분석을 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!