ホームページ >ウェブフロントエンド >jsチュートリアル >js実行のプロセス解析を解説するノード

js実行のプロセス解析を解説するノード

不言
不言オリジナル
2018-04-03 14:41:492101ブラウズ

この記事の内容は、js を説明して実行するノードのプロセスの分析を共有することです。興味のある友人は参照してください。必要な友人も参照してください。

説明: ノードはシングルスレッドです。 、非ブロッキング、およびイベント駆動型 (カーネル内の udev イベントと同様に、リスニング コールバック メカニズムを参照できます)

オブジェクトとしてノード v8.10.0 を使用し、主に 2 つのファイル src/node_main.cc とsrc/node.cc。

  1. 入口
    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(argv); &exec_argc, &exec_argv);
    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 context = Context::New(isolate);
    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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。