이벤트 루프 : Call Stack / Callback Queue / 단일 스레드 / Non-blocking / Asynchronous

uoayop·2021년 12월 23일
1

WEB

목록 보기
5/8
post-thumbnail

node.js를 찍먹하다가 Non-blocking과 단일 스레드 이벤트 루프를 알게 되었다.

node.js

크롬 V8 JS 엔진으로 빌드된 JS 런타임 환경

==자바스크립트를 브라우저 밖에서 사용할 수 있게 해주는 프로그램

  • 주소 서버 사이드 애플리케이션 개발에 사용되는 소프트웨어 플랫폼
  • 브라우저 🎈외부 환경에서 JS 애플리케이션 개발에 사용됨
  • Non-blocking I/O와 단일 스레드 이벤트 루프를 통해 높은 요청 처리 성능을 가짐

Non-blocking과 Asynchronous

None-blocking / Blocking 과 Synchronous / Asynchronous 개념은
얼핏 비슷해보이지만 관심사가 다름!

img

  • Non-Blocking / Blocking

    호출되는 함수가 바로 리턴하느냐 마느냐

    • Non-Blocking : 바로 리턴
      == 호출된 함수가 바로 리턴해서 호출한 함수에게 제어권을 넘겨주고, 호출한 함수가 다른 일을 할 수 있는 기회를 줄 수 있음
    • Blocking : 바로 리턴X
      == 호출된 함수가 자신의 작업을 모두 마칠 때까지 호출한 함수에게 대기하게 만듦
  • Synchronous / Asynchronous

    호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐

    • Asynchronous : 호출하는 함수는 작업 완료 여부를 신경쓰지 않음
      == 호출되는 함수에게 콜백을 전달한 뒤, 작업이 완료되면 콜백 실행
    • Synchronous : 호출하는 함수가 호출되는 함수의 작업 완료를 기다림

단일 스레드

  • 단일 스레드로 동작하는 JS로 멀티 스레드 환경을 연동하기 위한 장치
  • 프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위
    • OS로부터 CPU 자원을 할당 받은 독립적인 객체
    • 프로세스 간엔 자원을 공유하지 않음
  • 스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
    • 실제 자원을 실행하는 실행 흐름의 단위
  • 작업의 독립적인 단위 == 프로세스
    프로세스 안에 여러 쓰레드가 프로세스의 자원을 공유하며 작업 실행

엥 싱글 스레드인데 어떻게 비동기 작업을 하지요?
~~ 이벤트 루프


이벤트 루프

  • task가 들어오길 기다렸다가 들어오면 이를 처리하고,
    처리할 태스크가 없는 경우엔 잠드는 JS 내 루프
  • 처리해야 할 태스크가 있는 경우 먼저 들어온 태스크부터 순차적으로 처리
request('http://www.google.com', function(error, response, body) {
  console.log(body);
});

console.log('Done!');
  1. request 함수가 호출되면 call stack에 push,
    실행되면서 call stack에서 pop

  2. request web api 처리가 완료되면, 콜백 함수가 callback queue에 올라감

  3. console.log('Done!') 이 call stack 에 쌓임

  4. call stack에 아무것도 없고, callback queue에 task가 존재한다면
    이벤트 루프는 queue에 있는 task를 꺼내 call stack에 올려서
    콜백 함수를 실행함

  5. call stack, callback queue에 아무것도 없다면 프로그램 종료

  • 4줄 정리
  1. v8 엔진이 코드를 읽으면서 call stack에 넣음
  2. call stack에 쌓인 함수를 실행 (FILO)
  3. 함수를 실행하면서 비동기 처리가 필요한 애덜은 callback queue에 넣음
  4. 이벤트 루프는 call stack이 빈 상태가 되면,
    callback queue의 첫번째 콜백을 call stack으로 밀어넣음 (== tick)
  • 2줄 정리
  1. callstack == 지금 할 수 있는 일 / callback queue == 시간 걸리는 일
  2. 이벤트 루프가 하는 일
    == 지금 할 수 있는 일 다 끝냈으면 시간 걸리는 일 하나씩 꺼내옴

더 공부해야 할 내용

마이크로 태스크 큐, 매크로 태스크 큐

  • 일단 내가 찍먹해본 바론 같은 비동기 작업이더라도 우선순위를 따져야 하기 때문에 마이크로 태스트 큐가 필요하다.
    매크로 태스크 큐는 위에 적어 둔 콜백 큐.
  • promise나 async... 는 우선순위가 높아서 마이크로 태스크 큐에 들어간다
  • 이벤트 루프는 콜 스택이 비었을 때, 마이크로 태스크 큐부터 확인한다.
    만약 마이크로 태스트 큐에 콜백이 있으면, 콜백 큐보다 먼저 콜스택에 담는 듯!
  • 확실 x라 더 공부해서 정리해야함!

🌈 Reference

profile
slow and steady wins the race 🐢

0개의 댓글