>  기사  >  웹 프론트엔드  >  Node에서 js 실행 과정 분석을 설명합니다.

Node에서 js 실행 과정 분석을 설명합니다.

不言
不言원래의
2018-04-03 14:41:492083검색

이 글의 내용은 노드가 js를 설명하고 실행하는 과정을 분석한 내용을 공유하기 위한 것입니다. 관심 있는 친구는 한 번 살펴보고, 필요한 친구도 참고할 수 있습니다.

설명: 노드는 단일 스레드입니다. , 비차단 및 이벤트 기반(커널의 udev 이벤트와 유사하며 수신 콜백 메커니즘을 참조할 수 있음)

node-v8.10.0을 객체로 사용, 주로 src/node_main.cc 및 2개의 파일 src/node.cc.

  1. 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(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, 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 context = Context::New(isolate);
                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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.