20.02.04 노드 & 이벤트루프 & 논플로킹

sykim·2020년 2월 4일
0

노드란?

자바스크립트 런타임. 즉, 자바스크립트를 웹브라우저 바깥 환경에서 실행시킬 수 있게 만드는 프로그램.

이벤트 루프란?

        function first() {
            second();
            console.log('1')
        }   
        function second() {
            third();
            console.log('2')
        } 
        function third() {
            console.log('3')
        }
        first();

위 코드의 콘솔을 예상해보면 first가 선언이 되니 second 함수 호출 후 콘솔로그 '1'부터 찍을 것 같은데 실제로는 아래 그림과 같이 함수들이 스택이 된 후 콘솔은 스택의 위부터 차례대로 빠져나온다. (3->2->1) 그리고 이러한 스택을 호출스택(콜스택)이라 부른다.

function run() {
    console.log('3 후 실행')
}
console.log('시작')
setTimeout(run, 3000);
console.log('끝')

위 코드와 같이 setTimeout이 들어가면서 이벤트루프라는 개념이 등장한다.
콘솔 시작이 호출 스택에 쌓임과 동시에 사라지고 setTimeout 함수 run이 태스트큐라는 곳에 들어가는데 이곳은 호출 스택과 반대로 들어온 순서대로 나간다.
콘솔 끝이 호출 스택에 쌓임과 동시에 사라지고 그동안에 3초 뒤에 실행되는 함수 run이 3초 후 태스크 큐에서 나와 호출 스택으로 가서 콘솔을 찍고 사라진다. 이렇게 태스크 큐에 들어간 순서대로 꺼내오는 걸 이벤트루프의 역할이라고 한다.


태스크 큐에 들어가는 리스트

  • setTimeout, setInterval
  • setImmediate
  • Promise resolve, reject (async, await)
  • 이벤트리스터의 callback

우리가 브라우저 화면에서 컨텐츠를 볼 수 있는 건 주소창에 서버에게 요청을 보내고 응답으로 html을 받는 것이다. 그래서 어떤 화면이든 요청을 받고 응답하는 이벤트리스너가 하나는 있는 것이다.


위와 같이 이벤트들이 쌓이면 이벤트루프가 우선순위를 선별하여 태스크큐에서 호출스택으로 이동시킨다.
호출스택, 태스크큐에 아무것도 없어도 이미 등록해둔 이벤트리스너들 때문에 계속 화면이 돌아가는 경우 이벤트드리븐, 이벤트기반이라고 부른다.

논 블로킹 I/O


아까의 setTimeout run 함수를 태스크큐로 보내버림으로서 실행순서가 달라졌는데 이렇게 태스크큐로 보내버리는 동작을 논블로킹이라고 한다. 이벤트의 순서가 눈에 보이는 순서와 다르면 논블로킹이 일어난 것이다.
파일시스템/네트워크를 i/o라고 한다. (???)

싱글쓰레드

한 번에 한 가지 일만 하는 것.
프로세스를 여러개 만들어서 멀티 프로세싱을 하는 게 노드가 싱글쓰레드 단점을 극복하는 방법 중 하나이다.

profile
블로그 이전했습니다

0개의 댓글