Node.js 싱글쓰레드, 이벤트 기반, 논블로킹 I/O

Seokwon Han·2020년 11월 5일
0

CS 지식 정리

목록 보기
3/6

Node.js의 특징은 싱글쓰레드, 이벤트기반, 논블로킹 이다.
Node.js는 libuv라는 라이브러리를 사용하는데 이 libuv에서 이벤트 루프라는 기능을 제공한다.

싱글쓰레드

싱글쓰레드 기반의 이벤트루프가 계속 돌면서 요청을 처리한다. 블로킹io요청이 있는 경우 워커쓰레드풀에 작업을 넘긴다.(워커들은 멀티쓰레드이다)
따라서 만약 이벤트루프가 blocking된다면 많은 요청을 처리하기 힘들게된다.

이벤트 기반

이벤트 기반 : 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식

이벤트 리스너에 콜백함수를 저장해놓고 이벤트가 입력되면
해당 리스너의 콜백함수를 실행한다.
어떤 순서로 콜백 함수를 실행할 지는 이벤트 루프가 판단한다.

논블로킹 I/O

  • 호출 스택 : 함수 호출 시 호출한 순서대로 함수를 호출 스택에 넣는다.(LIFO)
    실행시에는 호출된 순서와 반대로 실행을 한다.
  • 태스크 큐(Task Queue) : 이벤트 발생 후, 실행되어야 하는 작업들이 순차적으로 대기하는 공간
  • 백그라운드(Background) : 타이머, I/O, 이벤트 리스너들이 대기하는 곳

노드는 코드를 읽을 때 위에서 아래로 한줄씩 코드를 실행한다.
함수 호출 부분을 발견하면 해당 함수를 호출 스택에 넣는다.

호출스택에서 코드 실행 시, 백그라운드가 필요한 작업(ex. setTimeout)은 백그라운드로 이동한다. 백그라운드에서 자체적으로 작업을 완료하고나면 콜백함수는 태스크 큐로 이동한다.

이벤트루프는 호출스택을 보고 있다가 호출스택이 비게되면 태스크 큐에 있는 콜백함수를 호출스택으로 넣는다. 그 후 이벤트루프는 태스크 큐에 새로운 콜백이 들어올때까지 대기한다.

이렇게 오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되도록 하고, 그 함수가 다시 태스크 큐를 거쳐서 호출 스택에 올라오기를 기다리는 방식이 논블로킹 I/O 방식이다.

profile
개발하면서 새로 배우거나 경험한 내용을 정리하고 그 외의 공부한 내용을 기록하는 곳입니다.

0개의 댓글