ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nodejs 동작 훑어보기
    NodeJS 2023. 5. 27. 12:17

    Single Thread??!

    nodejs는 Single Thread로 동작하지만,

    Asynchronous I/O(libuv) 를 지원합니다.

    bg right:20% width:240px


    What APIs use which async mechanism?

    • Kernel Async
      • TCP/UDP server and clients, pipes, dns.sresolveXXX
    • Thread Pool
      • fs.*, dns.lookup, pipes
    • NIX Only
      • UNIX domain sockets, TTY input, NIX signals
    • Windows Only
      • Child Process, TTY input, TCP servers

    How to work on libuv?

    • libuv는 운영체제의 커널을 추상화해서 비동기 API를 지원
    • libuv의 비동기 API를 처리 방식
      • 커널이 지원하는 비동기 작업을 libuv에게 요청하면 libuv는 대신 커널에게 이 작업을 비동기적으로 요청
        • 커널이 지원하지 않는 비동기 작업을 libuv에게 요청하면 livuv는 내부에 가지고있는 스레드 풀에게 이 작업을 요청

    What is libuv?

    • libuv라는 Asynchronous I/O 라이브러리가 존재하고 Node.js가 이를 내부적으로 이용합니다.

    • Node.js는 I/O 작업을 자신의 메인 스레드가 아닌 다른 스레드에 위임함으로써 Single Thread로 Asynchronous I/O를 지원 합니다.

    => 즉, Node.js는 Asynchronous I/O를 지원하고 그 기반에는 libuv가 있습니다.


    Event loop #1

    이벤트 루프는 Node.js가 여러 비동기 작업을 관리하기 위한 구현체입니다.

    • 타이머(Timers): setTimeout(),setInterval()에 의해 예약된 콜백 함수 실행
    • 보류 중인 콜백(Pending callbacks): Blocking 작업을 완료한 I/O 콜백 실행
    • 유휴 및 준비 (Idle, prepare): 이벤트 루프에서 사용하는 내부 단계

    Event loop #2

    • 폴링 (Poll): 새로운 I/O 이벤트를 검색하고 콜백을 실행
      • 처리할 I/O 이벤트가 없는 경우 이벤트 루프는 이 단계에서 Blocking되고 새 이벤트가 도착할 때까지 기다림
    • 확인 (Check): setImmediate()에 의해 예약된 콜백을 실행
    • 콜백 닫기 (Close callbacks): socket.on('close', ...)에 의해 예약된 것과 같은 콜백 닫기를 실행

    Process #1

    Timer Phase -> Pending Callbacks Phase -> Idle, Prepare Phase -> Poll Phase -> Check Phase -> Close Callbacks Phase -> Timer Phase

    한 페이즈(Phase)에서 다음 페이즈로 넘어가는 것을 틱(Tick)이라고 부릅니다.

    이때 이벤트 루프가 Node.js의 비동기 실행을 도와주는 것과 별개로 싱글 스레드이므로 한번에 하나의 페이즈에만 진입해 한번에 하나의 작업만 수행할 수 있습니다. Poll Phase 작업을 처리하면서 Check Phase의 작업을 동시에 처리하거나 Poll Phase의 작업을 한번에 여러 개씩 처리하는 것은 불가능합니다.


    Process #2

    각 페이즈는 자신만의 큐를 하나씩 가지고 있는데, 이 큐에는 이벤트 루프가 실행해야 하는 작업들이 순서대로 담겨있습니다. Node.js가 페이즈에 진입을 하면 이 큐에서 자바스크립트 코드(예를 들면 콜백)를 꺼내서 하나씩 실행한다. 만약 큐에 있는 작업들을 다 실행하거나, 시스템의 실행 한도에 다다르면 Node.js는 다음 페이즈로 넘어갑니다.


    Summary

    • 이벤트 루프는 Node.js가 비동기 작업을 관리하기 위한 구현체
    • 이벤트 루프는 총 6개의 페이즈로 구성되어 있으며 한 페이즈에서 다음 페이즈로 넘어가는 것을 틱이라고 함
    • 각 페이즈는 자신만의 큐를 관리
    • Node.js는 순서대로 페이즈를 방문하면서 큐에 쌓인 작업을 하나씩 실행
    • 페이즈의 큐에 담긴 작업을 모두 실행하거나 시스템의 실행 한도에 다다르면 Node.js는 다음 페이즈로 전환
    • 이벤트 루프가 살아있는 한 Node.js는 이벤트 루프를 반복

    Work process display

    Loupe

    JSV9000


    참고 자료

Designed by Tistory.