인프런 커뮤니티 질문&답변

jyy0223님의 프로필 이미지

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

BasePaginationDto 생성하기

NodeJS 의 single thread 와 event loop 에 대해 자세하게 알아 봤는데 제가 이해한 것이 맞는지 확인하고 싶어서 질문드렸어요!

24.02.17 18:30 작성

·

256

0

동작하는 원리와 각 키워드의 역할에 대해 제가 알고 있는 점을 정리해 봤습니다.

어디가 틀리고 맞는지 확인하기 어려워서 질문드렸습니다!

 

 

원리

  • 모든 task는 Call Stack(Execution Context Stack) 에 쌓인다. main thread는 Call Stack에 있는 작업을 순차적으로 진행한다.

  • 그런데 오래 걸리는 요청이 들어오면 main thread가 blocking 된다. 그래서 nonblocking 이 되도록 event loop 와 background, event queue, micro task queue 등 막히는 작업을 해결 해줄 공간이 존재한다.

  • 사용자가 요청을 보내면 오래 걸리든 아니든 우선은 Call Stack 에 쌓이게 된다.

  • main thread 가 요청을 하나씩 해결 하는데 오래 걸리는 task를 해결할때 blocking 되지 않도록 CPU의 가용 가능한 main thread 이외의 다른 Thread(background)에 Task를 던진다. 그 후 다음 동작을 진행한다.

  • main thread 와 background 는 동시에 task 를 동작하기에 nodejs 는 그 자체로 single thread 는 아니다. 사용자의 요청과 응답을 하는 task를 실행하는 thread가 1개라는 의미이다.

  • 이 background thread에서 작업이 완료된 task는 event queue와 micro task queue 에 순차적으로 들어가게 된다. promise, nextTick 등 우선순위가 높은 작업들은 micro task queue에 쌓인다.

  • Event Loop는 Call Stack에 모든 요청이 실행 완료되면 micro task queue, event queue에 있는 작업을 순서대로 Call Stack에 하나씩 담는다. micro task queue 에 task 가 있으면 event queue 보다 우선순위가 높아서 먼저 Call Stack 으로 이동한다.

  • event loop는 non-blocking을 위해서 task를 background에 던지고 반환되면 event queue, micro task queue에 던지고, call stack을 observing 하다가 비어 있게되면 task를 순서대로 하나씩 넣는다.

  • main thread는 call stack에 있는 task를 실행한다.

 

역할

  • main thread는 call stack에 있는 task를 실행한다. (얘는 이것만 하는 놈이다.)

  • background는 event loop에서 오래 걸리는 작업을 던짐 당한 곳이고 작업이 완료되면 event loop 에게 알리는 작업을 한다.

  • 여기서 Stack과 Queue는 모두 작업이 저장되는 공간인 메모리이다.(call stack, event queue, microtask queue)

  • 이 메모리의 작업을 수행하고 던지고 받고 등의 작업을 하는 thread는 main thread와 background 이다.

  • background 는 CPU 에서 가용 가능한 모든 thread 를 말하고 1개일 필요는 없다.

답변 1

2

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

2024. 02. 18. 16:15

안녕하세요!

Call Stack은 여러개의 요청을 쌓아두는 개념이 아닙니다.

강의에서도 설명 드렸지만 Call Stack은 어떤 한 함수를 실행하면서 지금까지 실행한, 그리고 실행해야 할 함수들을 쌓아두는 공간입니다. 예를들어서 A 함수에서 B 함수를 실행하고 B 함수에서 C 함수를 실행한다면 A, B, C 순서로 스택에 쌓이고 반대 순서로 스택에서 사라집니다 (또는 실행 '완료' 됩니다).

그렇기 때문에 말씀하신 관점에서 정확히 얘기한다면 콜스택은 요청당 존재한다고 보는게 맞습니다.

다만 말씀하신 요청을 쌓아두는 개념은 Event Queue가 담당하게 됩니다.

여러개의 요청들을 들고 있다가 사용 가능한 Event Loop이 하나씩 요청을 가져가서 프로세싱 하게 됩니다.

Background라고 표현하는게 정확한지는 제가 판단하기 어려우나 Internal Thread Pool을 Background라고 말씀하신걸로 보입니다.

말씀 하신대로 Internal Thread Pool은 Blocking 요청들을 처리하게 됩니다. 쉬운 예제로는 Database 요청이나 File System 관련 작업이 되겠습니다.

 

image

Event Queue는 개념을 잘못 알고 계셨어서 Microtask Queue와 Event Queue는 당연히 동급의 비교 대상은 아닙니다. Microtask Queue는 Macrotask Queue와 비교하는게 맞을 것 같습니다.

image

위 그림과 같이 Microtask Queue는 Promise 또는 async 함수등이 해당되고 Macrotask Queue는 setTimeout등이 해당됩니다. Event Loop이 우선적으로 프로세싱 하는건 Microtask Queue이며 이 이상의 차이는 없는걸로 저는 알고 있습니다.

감사합니다!

jyy0223님의 프로필 이미지
jyy0223
질문자

2024. 03. 10. 18:16

감사합니다!!!

한번 더 내용 확인 하려고 들어 왔는데 이전에 답글 남기는 걸 깜빡 했네요 ㅎㅎㅎ

항상 많이 배우고 있습니다. 감사합니다!!!

jyy0223님의 프로필 이미지

작성한 질문수

질문하기