총 10분 중 11분
2001
시즌 2개, 그리고 영화
시즌 2: 5화 “아일랜드”
출연: 이나영, 김민준, 김민정, 현빈
장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
KB_ITs_Your_Life_6th [Node.js] 비동기처리 동작을 이해해보자

*Node.js 프로그래밍 입문(고경희)를 읽고 작성한 글입니다. 


JS는 싱글 스레드 언어라 한 번에 하나의 작업을 처리한다고 알고 있다. 그런데 어떻게 비동기 처리를 한다는 걸까?? 요청이 실행될 동안 다른 함수를 실행하려면 실행하려는 스레드가 적어도 하나 이상이어야 할텐데 말이다.

우선, 노드가 함수를 어떻게 처리하는지 확인해보자. 

Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JS 런타임이다.

노드가 V8 엔진으로 자바 스크립트 코드를 처리한다. 이 V8 엔진 안에 Call Stack에 쌓여있는 함수를 사용자가 Call해서 사용하는 것이다.   동기 작업의 예시로 콜 스택의 동작을 이해해보면,

  1. 콜 스택에 있는 작업을 처리해서 그 결과를 표시합니다.
  2. 콜 스택에 있던 작업을 모두 처리했으므로 스택에서 사라집니다.
  3. 두 번째 처리할 작업을 콜 스택으로 옮깁니다.
  4. 콜 스택에 있는 작업을 처리해서 그 결과를 표시합니다.
  5. 콜 스택에 있는 작업을 모두 처리했으므로 스택에서 사라집니다. 

V8 엔진의 콜 스택은 비동기 처리를 할 수 없다. 그래서 libuv 라이브러리를 이용해 비동기 작업을 실행한다. 

libuv

Node API와 Callback queue를 가지고 있는 노드 내부 라이브러리다. 콜백 큐는 콜백 함수를 큐 형태로 저장하는 자료 구조다. 

  1. 첫 번째  처리할 작업을 콜 스택으로 옮깁니다.
  2. 콜 스택에 있는 작업을 처리해서 그 결과를 표시합니다.
  3. 콜 스택에 있던 작업을 모두 처리했으므로 스택에서 사라집니다.
  4. 두 번째 처리할 작업을 콜 스택으로 옮깁니다.
  5. 콜 스택에 있는 작업이 비동기 함수라면 libuv로 옮깁니다.
    (setTimeout은 노드에서 제공하는 비동기함수이므로 Node API로 옮겨진다.)

 

6. 콜 스택이 비어있어 다음에 처리할 작업을 콜 스택으로 가져옵니다. 

7. 콜 스택에 있는 작업을 처리한 후 결과를 표시합니다.

8. 콜 스택에 있던 작업을 모두 처리했으므로 스택에서 사라집니다. 더 이상 불러올 함수가 없다면 libuv를 살펴봅니다. 

9. libuv에서 비동기 작업이 모두 끝나면 콜백 함수를 콜백 큐로 옮깁니다. 

10. 노드는 콜 스택이 비어 있는지 계속 체크합니다. 콜 스택이 비어있어 당장 실행할 작업이 없다면 콜백 큐에 있는 콜백 함수를 콜 스택으로 옮깁니다. 

11. 콜 스택에 있는 작업을 처리한 후 콜 스택에서 제거합니다. 콜백 큐에 다른 작업이 대기하고 있다면 콜 스택으로 가져와 처리한다. 이런 식으로 콜 스택과 콜백 큐를 번갈아 보면서 처리할 순서를 결정하게 된다. 

 

결론

즉, 콜 스택에 있는 비동기 함수는 libuv에 넘어가 작업을 처리한 뒤에 콜백 큐로 넘어가는데 ! 콜 스택에서 pop 되어야 실행되는 것이므로 콜 스택이 비면 콜백 큐에서 함수를 하나씩 꺼내와 처리하도록 관리해야 한다. 콜백 큐와 콜 스택을 왔다갔다 하면서 관리하는 과정을 이벤트 루프라고 한다. 

 

코드와 더 디테일한 정보를 위해선 👇

 

비동기 처리

비동기 처리란 시간이 오래 걸리는 함수와 빨리 끝나는 함수가 섞여있을 때 함수를 원하는 처리 순서에 맞게 프로그래밍하는 것을 말한다.동기 프로그래밍 : 커피 주문을 받고, 커피가 완성될

ahranah.tistory.com

 

 

KB_ITs_Your_Life_6th [Node.js] 비동기처리 동작을 이해해보자