[Node.js] 호출 스택과 이벤트 루프

Cjw.dev·2023년 2월 20일

Node.js

목록 보기
7/10
//1 호출 스택(동기)

function first (){
    second();
    console.log("첫번째");
}
function second(){
    third();
    console.log("두번째");
}

function third(){
    console.log("세번째");
}

first(); 

// 위 코드 순서 예측해보기 
// 세번째 -> 두번째 -> 첫번째 

호출 스택 (함수의 호출, 자료 구조의 스택)

  • Anonymous은 가상의 전역 컨텍스트(항상 있다고 생각하는게 좋음)
    (Anonymous : 크롬에서 실행하면 쌓이게 되는 것. 파일이 시작되면 생기고 끝나면 사라짐)

  • 함수 호출 순서대로 쌓이고, 역순으로 실행됨
    (함수안에 함수가 있을 때 스택에 쌓이게 됨. first()가 끝나고 second()가 실행되면 쌓이지 않음)

  • 함수 실행이 완료되면 스택에서 빠짐

  • LIFO구조라서 스택이라고 불림
    ※ LIFO(Last in First Out) : 후입선출

  • 자바스크립트가 동기적으로 어떻게 실행되는지 파악할 수 있는 것이 호출 스택

// 2 이벤트 루프(비동기)

function run(){
    console.log("3초후 실행");
}
console.log("start");
setTimeout(run, 3000);
console.log("end");

// 위 코드 순서 예측해보기 
// start -> end -> 3초후 실행
// 호출 스택만으로는 설명이 안됨(run은 호출 안했는데?)
// 호출 스택 + 이벤트 루프로 설명할 수 있음. 

이벤트 루프

  • 비동기 함수(setTimeout)는 호출되고 스택에서 빠진 후 백그라운드에 실행될 함수를 보낸다.
  • 이후 백그라운드에 보낸 함수와 호출 스택은 동시에 실행된다.
    (백그라운드는 비동기로 실행 + 백그라운드는 다른 스레드가 실행)
  • 백그라운드가 먼저 동작이 끝났더라도 호출 스택이 먼저 처리가 된다.
  • 이벤트 루프의 역할 : 태스크 큐에 함수가 있고 호출 스택이 비어있을 때 태스크 큐에서 함수를 끌어와 호출 스택에서 실행한다.
  • 백그라운드에 보낼 수 있는 함수는 제한적임(setTimeout, setInterval, 네트워크 요청, 다른 서버로 갔다오는 요청, 하드디스크의 파일 읽는 fs명령어, 암호화(크립트), 압축)
// 이벤트 루프 훈련
function oneMore(){
    console.log("one more");
}
function run(){
    console.log("run run");
    setTimeout(()=>{
        console.log("wow")
    }, 0)
    new Promise((resolve)=>{
        resolve("hi");
    })
    .then(console.log);
    oneMore();
}

setTimeout(run,5000);

// 위 코드 순서 예측해 보기 
// run run -> one more -> hi -> wow
// promise.then/catch or process.nextTick은 
// setTimeout 보다 우선순위이기에 태스크 큐에서 호출 스택으로 먼저 이동하여 호출된다. 
profile
백엔드 개발 공부 기록 22.11.07 ~ ing

0개의 댓글