この記事の内容は、js を説明して実行するノードのプロセスの分析を共有することです。興味のある友人は参照してください。必要な友人も参照してください。
説明: ノードはシングルスレッドです。 、非ブロッキング、およびイベント駆動型 (カーネル内の udev イベントと同様に、リスニング コールバック メカニズムを参照できます)
オブジェクトとしてノード v8.10.0 を使用し、主に 2 つのファイル src/node_main.cc とsrc/node.cc。
入口
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_locktype_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)) A E: 4871 Argv = UV_Setup_ARGS (ARGC, ARGV);
定義: DEPS/UV/Include/UV.H: 1051: UV_EXTERN CHAR ** uv_Args (int ARGC, Char ** ARGV) 実現:: 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, exec_argc、exec_argv) ;
4502 ParseArgs(argc, argv, exec_argc, exec_argv, &v8_argc, &v8_argv, is _env);
4015 static void ParseArgs(int* argc,
パラメータを解析します
g: openssl 関連の設定
h: 4895 v8_platform.Initialize (v8_thread_pool_size, uv_default_loop());
i: 4902 V8::Initialize();
v8 初期化
j: 4905 const int exit_code =
4906 Start(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. 部分を分析します。 j in 1
a: 4814 inline int Start(uv_loop_t*event_loop,
4815 int argc, const char* const* argv,
4816 int exec_argc, const char* const* exec_argv) {
b: 4824 Isolate* const isolate = Isolate::New(params);
4828 isolate->AddMessageListener(OnMessage);
4829 isolate->SetAbortOnUncaughtExceptionCallback(ShouldAbortOnUncaughtException) ;
4830 isolate->SetAutorunMicrotasks(false);
4831 isolate->SetFatalErrorHandler(OnFatalError);
新しい Isolate オブジェクト、および関連するパラメータを設定します。
c: 4843 int exit_code;
4844 {
4845 ロッカーロッカー(隔離) ;
4846 Isolate::Scope isolate_scope(isolate);
4847 HandleScope handle_scope(isolate);
4848 IsolateData isolate_data(isolate、allocator.zero_fill_field、 ());
4849 exit_code = Start(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 handle_scope(isolate);
4749 Local
4750 Context::Scope context_scope(context);
4751 環境env(isolate_data, context);
4754 env.Start(argc, argv, argc、exec_argv、v8_is_profiling);
执行代 src/env.cc:18:voidEnvironment::Start(int argc,
4771 LoadEnvironment(&env);
加下env
f: 在d中の関数数里面進行イベントループ,イベント有時刻,就会退出ノード
3. 核心部分の分析
4777 {
4778 SealHandleScope seal(isolate);
4779 bool more;
4780 PERFORMANCE_MARK(&env, LO OP_START);
4781 do {
4782 uv_run(env.event_loop(), UV_RUN_DEFAULT);
4783
4784v8_platform.drainvmtasks();
4785 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) ||
338 uv__has_active_reqs(ループ) |。 uv__has_active_reqs(loop) を定義します
以上がjs実行のプロセス解析を解説するノードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。