Libuv uv_run()


### 이벤트 루프는 하나의 쓰레드로 동작
이벤트루프를 만들어 주는 코드
코드가 어떻게 동작 되는지가 아니라 어떤 순으로 실행되고 있는지
해당 코드가 while()로 동작합니다. 바로 해당 부분이 이벤트루프
libuv는 비동기 형태로 동작하기 위해 내부적으로 쓰레드풀 가짐
**동기작업을 수행할 때 쓰레드에게 작업 위임을 하고 코드 제어권을 넘겨주는 역할**

```type   ┌───────────────────────────┐┌─>│           timers        ││  └─────────────┬─────────────┘│  ┌─────────────┴─────────────┐│  │     pending callbacks   ││  └─────────────┬─────────────┘│  ┌─────────────┴─────────────┐│  │       idle, prepare     ││  └─────────────┬─────────────┘      ┌───────────────┐│  ┌─────────────┴─────────────┐      │   incoming:  ││  │           poll          │ <─── ┤  connections,││  └─────────────┬─────────────┘      │   data, etc. ││  ┌─────────────┴─────────────┐      └───────────────┘│  │           check         ││  └─────────────┬─────────────┘│  ┌─────────────┴─────────────┐└──┤      close callbacks    │   └───────────────────────────┘```
timers -> pending callbacks -> idle, prepare -> poll -> check -> close callbacks 순으로 호출
이때 별도로 관리되는 nestTickQueue와 microTaskQueue
각각을 phase라고 한다


ibuv는 시스템 API나 쓰레드 풀에게 작업을 비동기 형태로 전달한 후 콜백을 큐들에 저장한다고 했는데 거기서 말한 큐들이
 timers, pending callbacks, idle/prepare, poll, check, close callbacks, nestTickQueue, microTaskQueue
우리가 등록한 콜백은 성격에 따라 유형에 맞는 큐에 등록
그리고 이벤트 루프가 돌면서 각 큐에 포함된 콜백을 가져와 실행


```typeint uv_run(uv_loop_t* loop, uv_run_mode mode) {  int timeout, r, ran_pending;  r = uv__loop_alive(loop);  if (!r) uv__update_time(loop);  while (r != 0 && loop->stop_flag == 0) {    uv__update_time(loop);    uv__run_timers(loop);    ran_pending = uv__run_pending(loop);    uv__run_idle(loop);    uv__run_prepare(loop);    timeout = 0;    if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT)      timeout = uv_backend_timeout(loop);    uv__io_poll(loop, timeout);    uv__run_check(loop);    uv__run_closing_handles(loop);    if (mode == UV_RUN_ONCE) {      uv__update_time(loop);      uv__run_timers(loop);    }    r = uv__loop_alive(loop);    if (mode == UV_RUN_ONCE || mode == UV_RUN_NOWAIT) break;  }  if (loop->stop_flag != 0) loop->stop_flag = 0;  return r;}```


> [nodejs/node](https://github.com/nodejs/node/blob/master/deps/uv/src/unix/core.c)

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





