ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • libuv의 이벤트루프 맛보기
    Node.js 2020. 5. 8. 01:30

     

    누군가 Node.js의 강점을 물어보면 마치 조건반사처럼 구글의 V8엔진을 이용하며 이벤트루프를 통한 non-blocking I/O 라고 번개처럼 대답을 합니다. 

     

    하지만 아래와같이 스스로에게 물어봤을때 만족스럽지 못한 답변을하는 나를 발견하고 다시 이벤트루프에대해 공부하고 짧고 간략하게 정리를  해봅니다.

     

    1. 이벤트 루프가 무엇인가?
    2. 이벤트 루프는 어디서 동작하는것인가?
    3. 이벤트 루프가 어떻게 동작하는것인가?

    4. Node.js에서 이벤트처리(event-driven)가 이뤄지는 구조가 머리속에 떠오르지 않는다.

    등등

     

    저처럼 Node.js를 이용하여 개발은 하는데 위와 비슷한 갈증이 느껴지시는 분들에게 도움이 되었으면 좋겠습니다.

     

    좀더 깊고 자세한 설명

    https://sjh836.tistory.com/149

    https://nodejs.org/ko/docs/guides/event-loop-timers-and-nexttick/

     

     

     

    먼저 이벤트루프는  코드를 실행시키고 그 안에서 발생하는 이벤트를 처리하기 위해 여러 단계를 꾸준히 반복하는 것을 의미한다고 생각합니다.

     

     

    Nodejs 이벤트 처리

    위 그림은 Node.js의 non-blocking I/O를 가능하게 만들어준 이벤트 처리에대한 그림입니다.

     

    Nodejs의 핵심 라이브러리 중 libuv라는 것이 있습니다.

    libuv는 비동기입출력, 이벤트기반에 초점을 두고 OS 커널을 wrapping 한 라이브러리입니다.

    libuv는 FIFO 큐 구조의 phase(단계) 를 가지고 있으며 이 몇개의 큐를 무한히 반복하는것이 이벤트 루프입니다.

    이벤트 루프가 주어진 단계에 들어가면 해당 단계에 특정한 작업을 수행 한 다음 큐가 소진되거나 최대 콜백 수가 실행될 때까지 해당 단계의 큐에서 콜백을 실행합니다. 큐가 소진되었거나 콜백 한계에 도달하면 이벤트 루프가 다음 단계로 이동합니다.

     

    위 그림을 차례로 설명하면

     

    1. js에서 이벤트 발생

     

    2. 이벤트가 알맞는 phase에  삽입

     

    3. 이벤트 루프가 각 phase를 돌면서 큐에 있는 작업을 실행

    ( libuv는 커널단 (윈도우의 경우 IOCP, 리눅스는 AIO) 에서 어떤 비동기 작업들이 가능한지 알고 있기때문에, 해당 작업들을 받으면, 커널의 비동기함수들을 호출, 비동기 작업이 불가능한 경우 libuv가 worker 쓰레드를 실행 )

     

    4. 작업이 끝나면 해당 phase의 작업을 비우고 다음 작업을 실행

     

     

     

Designed by Tistory.