Libuv uv_io()


### fs나 네트워크를 이용하는 동기/비동기 모듈(라이브러리)들은 uv_io 를 호출하도록 cpp를 랩핑한 js로 구현
그리고 이벤트 루프는 큐에 등록된 작업을 실행하며 프로그램 유지
node.js가 실행할 때 동작하는 코드
```typeint NodeMainInstance::Run() {  Locker locker(isolate_);  Isolate::Scope isolate_scope(isolate_);  HandleScope handle_scope(isolate_);  int exit_code = 0;  DeleteFnPtr<Environment, FreeEnvironment> env =      CreateMainEnvironment(&exit_code);  CHECK_NOT_NULL(env);  Context::Scope context_scope(env->context());  if (exit_code == 0) {    LoadEnvironment(env.get());    env->set_trace_sync_io(env->options()->trace_sync_io);    {      SealHandleScope seal(isolate_);      bool more;      env->performance_state()->Mark(          node::performance::NODE_PERFORMANCE_MILESTONE_LOOP_START);      do {        uv_run(env->event_loop(), UV_RUN_DEFAULT);        per_process::v8_platform.DrainVMTasks(isolate_);        more = uv_loop_alive(env->event_loop());        if (more && !env->is_stopping()) continue;        if (!uv_loop_alive(env->event_loop())) {          EmitBeforeExit(env.get());        }        // Emit `beforeExit` if the loop became alive either after emitting        // event, or after running some callbacks.        more = uv_loop_alive(env->event_loop());      } while (more == true && !env->is_stopping());      env->performance_state()->Mark(          node::performance::NODE_PERFORMANCE_MILESTONE_LOOP_EXIT);    }    env->set_trace_sync_io(false);    exit_code = EmitExit(env.get());  }  ResetStdio();  // TODO(addaleax): Neither NODE_SHARED_MODE nor HAVE_INSPECTOR really  // make sense here.#if HAVE_INSPECTOR && defined(__POSIX__) && !defined(NODE_SHARED_MODE)  struct sigaction act;  memset(&act, 0, sizeof(act));  for (unsigned nr = 1; nr < kMaxSignal; nr += 1) {    if (nr == SIGKILL || nr == SIGSTOP || nr == SIGPROF)      continue;    act.sa_handler = (nr == SIGPIPE) ? SIG_IGN : SIG_DFL;    CHECK_EQ(0, sigaction(nr, &act, nullptr));  }#endif#if defined(LEAK_SANITIZER)  __lsan_do_leak_check();#endif  return exit_code;}```
1. js로 작성된 코드를 nodejs로 실행
2. 이벤트 루프에 진입하기 전에 코드를 실행
3. fs, socket 통신과 같이 libuv를 호출하는 함수가 있으면 libuv는 코드 제어권을 가지지 않고 다음 코드를 실행할수 있도록 제어권을 넘김
3.1 libuv는 호출된 작업이 **동기**/**비동기** 검사후 시스템 API를 이용하거나 쓰레드풀에 생성된 쓰레드에게 작업 위임후 이때 작업이 완료되면 콜백을 큐에 등록
4. 코드들을 마저 실행
5. 코드들을 다 실행했으면 이벤트루프를 만들지, 종료할지 결정(libuv에 의해 콜백이 등록되었다면 이벤트루프 생성, 없으면 프로그램 종료)




exit_code에 따라 uv_run()을 호출
exit_code가 이벤트루프를 만들어 줄 지 결정하는 플래그 변수
uv_run()은 이벤트루프를 만들어 주는 코드

> [nodejs/node](https://github.com/nodejs/node/blob/master/src/node_main_instance.cc)

> [[node.js] node.js의 이벤트루프와 libuv의 이해](https://m.blog.naver.com/pjt3591oo/221976414901)






