동기와 비동기

동기란?

요청한 작업에 대해 순서가 지켜지는 것

비동기란?

요청한 작업에 대해 순서가 지켜지지 않을 수 있는 것

블로킹이란?
요청에 대한 결과를 기다리도록 하는 것

논 블로킹이란?
요청에 대한 응답을 기다리지 않고, 다음 작업을 바로 수행하는 것

비동기 프로그래밍의 필요성

I/O 작업과 같은 느린 작업이 발생할 때, 기다리지 않고 다른 작업과 동시에 처리하여 시스템 성능을 향상시킬 수 있다.

실행 컨텍스트

실행 컨텍스트란?

스코프와 코드 실행 순서 관리를 구현한 내부 메커니즘이다.
식별자와 스코프는 렉시컬 환경으로 관리하고, 코드 실행 순서는 실행 컨텍스트 스택으로 관리한다.

실행 컨텍스트는 힙에 저장된 객체를 참조한다.

렉시컬 환경

식별자, 식별자에 바인딩된 값, 상위 스코프에 대한 참조를 기록하는 자료구조

  • 객체가 저장되는 메모리 공간
  • 객체는 원시 값과 달리 크기가 정해져 있지 않으므로 할당해야 할 메모리 크기를 런타임에 결정(동적 할당)한다.

실행 컨텍스트 스택 (콜 스택)

  • 소스코드(전역 코드나 함수 코드 등) 평가 과정에서 생성된 실행 컨텍스트가 추가/제거되는 스택 자료구조
  • 마지막으로 푸시된 실행 컨텍스트가 먼저 실행(LIFO)된다.

실행 컨텍스트 스택과 싱글 스레드

자바스크립트 엔진은 하나의 실행 컨텍스트 스택을 갖는다. 따라서 한 번에 하나의 태스크만 실행하는 싱글 스레드 방식으로 동작한다.
하지만 자바스크립트를 실행해보면, 여러 태스크를 동시에 처리되는 것처럼 보인다.
이는 브라우저가 멀티 스레드로 동작하기 때문이다. 비동기 처리에서 소스코드의 평가와 실행을 제외한 모든 처리는 브라우저가 담당한다.
이를 위해 브라우저는 이벤트 루프와 콜백 큐를 제공한다.

브라우저에 내장되어 있는 자바스크립트 엔진콜 스택으로 구성되어 있다.

서버에게 리소스를 요청하거나 파일 입출력 혹은 타이머 대기 작업을 실행하는 Web APIs는 멀티 스레드다.
(각 API마다 스레드가 할당되어 있다)

이벤트 루프

이벤트 루프란?

이벤트 루프는 작업을 옮기는 역할을 한다.
비동기 코드를 Web API에 옮기고, 작업이 완료되면 콜백 함수를 콜백 큐에 적재하고, 콜 스택이 비면 콜 스택에 적재시킨다.

이벤트 루프 동작 과정

  1. 함수가 호출되면 실행 컨텍스트가 생성되어 콜 스택에 쌓인다.
    마지막에 들어온 함수가 먼저 실행된다.
  2. 이때 이벤트 루프는 비동기 함수 작업을 Web API에 옮기고,
    작업이 완료되면 콜백을 콜백 큐에 적재한다.
  3. 콜 스택에 현재 실행 중인 실행 컨텍스트가 있는지, 콜백 큐에 대기 중인 함수가 있는지 반복해서 확인한다.
    콜 스택이 비어있고 콜백 큐에 대기 중인 함수가 있다면 순차적(FIFO)으로 콜 스택으로 이동시킨다.
  4. 콜 스택으로 이동한 함수는 실행된다.

콜 스택 = 호출 스택
콜백 큐 = 이벤트 큐 = 태스크 큐 + 마이크로태스크 큐

태스크 큐
비동기 함수의 콜백 함수, 이벤트 핸들러가 일시적으로 보관되는 영역

마이크로태스크 큐
프로미스의 후속 처리 메서드의 콜백 함수가 일시적으로 보관되는 영역.
태스크 큐보다 우선순위가 높다.

0개의 댓글