inflearn logo
강의

Course

Instructor

"The Era of AI Clicks" Breaking Through with Principles: Node.js and CS Part 1 - V8 and Core Deconstruction

[Lecture Notes] Session 4: Overcoming the Limitations of Single-Threading: An In-Depth Analysis of the Call Stack, libuv, Event Queue, and the 6 Stages of the Event Loop

call stack 표현이 잘못표현된것이 아닌가요?

Resolved

5

hanumoka

14 asked

0

5. [실전 훈련] 사고 실험: 상태 누적 시각화 추적하기

예시에서

[Step 2] setTimeout과 Promise 등록
등을 보면 Call Stack이 비어있음 이라고 표현하셨는데, main 호출후 -> 동기코드 완료될때까지. Call Stack은 엄밀히 비어있는 상태가 아니지 않나요?
즉 console.log("D") 가 출력되기 전까지는
콜 스택이 비워지는 상태가 발생할수 없지 않나요?

 혹시 제가 잘못 알고 있을수도 있으니
조심히 여쭙습니다.

javascript node.js 컴퓨터-구조 frontend backend

Answer 2

0

nhcodingstudio

안녕하세요 hanumoka님, 남겨주신 질문에 대해 답변드립니다.

먼저 결론부터 말씀드리면 hanumoka님께서 짚어주신 내용이 100% 맞습니다. 자바스크립트 코드가 처음 실행될 때부터 마지막 동기 코드가 끝날 때까지 콜 스택은 엄밀히 말해 완전히 비어있는 상태가 될 수 없거든요. 코드가 처음 실행되면 가장 먼저 콜 스택 바닥에 전역 실행 컨텍스트가 깔리게 되는데, 에러 스택 트레이스에서 주로 main이나 anonymous로 표기되는 바로 그 부분입니다. 이 전역 실행 컨텍스트는 전체 스크립트의 동기적 실행이 모두 끝날 때까지 스택에 계속 남아있게 되죠.

그래서 강의 노트의 두 번째 단계에서 콜 스택이 비어있다고 표현했던 것은, setTimeout이나 Promise 같은 개별 비동기 함수들이 블로킹을 일으키지 않고 호출 직후 스택에서 즉시 빠져나간다는 점을 강조하려다 보니 전역 컨텍스트를 의도적으로 생략하고 조금 단순화해서 설명한 부분이었습니다. 이 부분을 컴퓨터 공학적으로 엄밀하게 다시 살펴보면, hanumoka님 말씀대로 개별 비동기 함수들은 지시를 마치고 스택에서 빠져나가지만 전역 컨텍스트인 main은 여전히 콜 스택을 차지하고 있는 상태가 맞습니다.

Plaintext

[Step 2] setTimeout과 Promise 등록 직후 (엄밀한 상태)
-----------------------------------------------------
* 개별 비동기 함수들은 지시를 마치고 스택에서 Pop 되지만, 전역 컨텍스트는 남아있음.

[ Call Stack ] : [ Global Execution Context (main) ]  <-- 여전히 스택을 차지하고 있음
[ VIP 결재함 ] : [ "C: VIP 결재" ] 
[ 일반 1번 정거장 ] : [ "B: 알람" ] 

그리고 나서 이후에 console.log("D")까지 모두 실행되고 나서야 비로소 전역 실행 컨텍스트인 main이 스택에서 빠져나가게 되고, 바로 이때 처음으로 콜 스택이 완전히 비워진 상태가 되는 것이죠.

이 과정을 조금 더 깊이 이해하시는 데 도움이 될까 해서 V8 엔진의 내부 개념인 'Microtask Checkpoint'에 대한 내용도 살짝 덧붙여 드릴게요. 콜 스택에서 전역 컨텍스트가 빠져나가며 스택이 완전히 텅 비는 바로 그 찰나의 순간에, 자바스크립트 엔진은 마이크로태스크 체크포인트를 발생시킵니다. 이 체크포인트가 발생하면 엔진은 이벤트 루프의 일반 정거장(타이머 등)으로 넘어가기 전에, 무조건 VIP 결재함인 마이크로태스크 큐부터 확인해서 대기 중인 모든 프로미스 콜백을 콜 스택으로 끌어올려 실행하게 됩니다. 즉, 강의에서 말씀드렸던 이벤트 루프의 'VIP 새치기'가 최초로 발동하는 트리거 자체가 바로 동기 코드의 실행이 모두 끝나고 main 컨텍스트가 종료되면서 콜 스택이 비워지는 순간인 것입니다.

강의에서 추상적으로 표현하다 보니 생길 수 있었던 맹점을 이렇게 정확하게 짚어주셔서 정말 감사드립니다. 엔진의 내부 동작을 실행 컨텍스트 단위까지 추적하시는 시야를 가지신 만큼, 앞으로 백엔드 병목 분석이나 디버깅을 하실 때도 분명 큰 강점을 발휘하실 거라 생각해요.

끝으로 혹시 저희 교육 과정 중에 추가로 수강을 희망하시는 강의가 있다면 문의 이메일인 jeony0535@naver.com으로 편하게 연락해 주십시오. 확인 후 즉시 할인 쿠폰을 전달해 드리겠습니다. 다시 한번 귀한 시간과 마음 내어 주셔서 감사합니다. hanumoka님의 성장을 진심으로 응원하겠습니다! :D

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. hanumoka님.

call stack 표현과 관련하여 질문해 주셔서 감사합니다. Call Stack의 개념은 JavaScript의 비동기 처리에서 이해해야 할 중요한 부분이죠. 질문하신 내용을 바탕으로, 여기에서 조금 더 자세히 설명해 드리겠습니다.

Call Stack의 이해

  1. Call Stack:

    • Call Stack은 현재 실행할 함수와 관련된 작업을 추적하는 구조입니다. 동기 코드가 실행될 때 이 Stack에 함수 호출이 쌓이고, 함수가 종료되면 해당 스택이 비워집니다.
  2. 주어진 예시에서의 상황:

    • setTimeout이나 Promise는 비동기적으로 작업을 처리합니다. 이 비동기 작업은 Call Stack에 바로 올라가지 않으며, 태스크 큐나 마이크로태스크 큐에 등록되어 비동기 처리를 대기합니다.
    • 메인 실행 컨텍스트: 메인 코드 실행 시, 호출 스택(Call Stack)에 엔트리가 쌓이고, 즉시 실행되는 동기 코드(console.log("D"))의 실행이 완료되면 스택은 비워집니다.
  3. 이와 관련한 개념:

    • console.log("D")와 같은 동기 코드가 실행 중일 때는 해당 호출 스택에 남아 있으나, 이 코드가 실행을 마치면 Call Stack은 비워지게 됩니다.
    • 이후 비동기 태스크(awaits setTimeout 및 Promise)는 이벤트 루프에 의해 Call Stack이 비워진 후 들어오게 됩니다.

즉, 기본적으로 console.log("D")와 같은 마지막 동기 코드가 실행될 때까지 Call Stack은 비어있지 않습니다. 올바른 처리 흐름을 이해하는 것은 비동기 JavaScript 코드를 작성하는 데 매우 중요하며, 해당 부분을 명확히 이해하시려는 노력은 매우 칭찬할 만합니다.

자세한 사항은 다음의 Node.js와 비동기 처리 관련 자료를 참조해 보시면 추가적인 도움이 될 수 있습니다:
- Node.js Event Loop Documentation
- JavaScript Call Stack, Event Loop Basics

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

추천해주신 책에 대해 문의드립니다.

0

4

0

전자책으로 구매인증 가능할까요?

0

33

1

강의자료가 누락됐어요

0

40

2

cache관련 질문 드립니다

0

26

1

React 와 Virtual DOM 의 이야기 영상 실행이 안됩니다.

0

29

1

형 책 어떻게 받아?

1

47

1

PPT 자료 공유 받을 수 있을까요?

0

29

1

4주차 미션 게시판이 안보여요~

0

41

2

강의 일정 및 수업 자료 공유 관련 문의드립니다!

0

32

1

6번 질문

0

52

2

일반 강의와 차이점?

1

37

1

수강완료 후 문의 드립니다.

1

41

2

!= 연산자의 역할

0

32

1

JpaCursorItemReader의 정렬 조건 부재의 영향

1

38

2

sizeof는 컴파일 타임 연산자라서 CPU를 사용치 않는다

0

29

2

중요하진 않지만 설명하신부분에서 안된부분..

0

28

0

"컴파일 시점에 없는 값을 어떻게 참조할 것인가?" 섹션

1

47

2

강의 듣는 순서가 어떻게 되나요?

0

46

1

stopPropagation()에 대해서 질문 있습니다.

0

46

2

혹시 다음 강의 제작 예정된 것들이 있을까요?

0

69

1

1강 질문

0

60

2

ai가 만든 강의인가요?

0

115

1

3강 질문

0

73

2

2강 nodejs 3단계 설명 질문

0

82

1