반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 스프링 검증
  • 슬로우 쿼리
  • 자바 검증
  • bean Validation
  • 자바스크립트 인터뷰
  • 빈 검증
  • Javadoc 자바독 자바주석 주석 Comment
  • 플라이웨이트패턴
  • 싱글톤 패턴
  • prerendering
  • 팩터리 메서드 패턴
  • 알고리즘
  • 자바
  • serverless computing
  • 작업기억공간
  • 객체복사
  • 메이븐 페이즈
  • 서버리스 컴퓨팅
  • 자료구조
  • 싱글톤
  • Java
  • 토비의 스프링
  • 자바스크립트 면접
  • 디자인패턴
  • Pre-rendering
  • pnpm
  • 자바 디자인패턴
  • item7
  • 이펙티브 자바 item9
  • item8
  • rust
  • 참조 해제
  • 이펙티브 자바
  • try-with-resources
  • NEXT JS
  • next js app
  • item9
  • 추상 팩터리 패턴
  • 메이븐 라이프사이클
  • Next.js
  • 메이븐 골
  • 자바스크립트
  • 느린 쿼리
  • 러스트
  • 외래키 제약조건
  • 도커공식문서
  • 싱글턴
  • 프로그래머의 뇌
  • MSSQL
  • 이펙티브자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

자바스크립트/개념

이벤트 루프는 어떻게 non-blocking 연산을 막힘없이 처리하는가?

2024. 1. 4. 23:11

자바스크립트 이벤트 루프 파헤치기

  • 이를 이해하기 위해서는 자바스크립트 런타임 환경에서의 추가적인 컴포넌트의 역할을 알아야 한다.
  • 추가적인 컴포넌트란 Web APIs (브라우저에서) 나 C++ APIs (Node.js) 를 말하며 이를 알아야 한다.

자바스크립트 런타임 환경 컴포넌트 4가지

  • Heap: 메모리 할당이 이루어지는 곳
  • Stack: 스택 프레임 (함수 호출) 이 저장되고 관리되는 곳
  • Task Queue: 비동기 작업의 콜백이 여기에 대기함
  • Event Loop: 호출 스택과 작업의 대기열을 확인하는 오케스트레이터

Non-Blocking I/O 는 어떻게 동작하는가?

  • 비동기 호출: HTTP 요청, 타이머, Node.js 의 파일 I/O 와 같은 비동기 함수가 호출되면 Javascript 는 이 작업을 자체 스레드 밖인 브라우저나 Node.js 로 전송하여 환경에서 제공하는 다른 스레드에서 처리하도록 한다.
  • 계속 실행: 이런 연산이 비동기적으로 처리되는 동안 자바스크립트의 호출 스택은 연산이 완료될 때까지 기다리지 않고 다른 코드를 계속 실행할 수 있다. 이를 논 블로킹이라고 한다.
  • 콜백 및 작업 대기열: 비동기 작업이 완료되면 해당 콜백 함수는 작업 대기열에 배치된다.
  • 이벤트 루프의 역할: 지속적으로 호출 스택을 확인하며, 호출 스택이 비어 있으면 이벤트 루프는 작업 대기열에서 첫번째 콜백을 가져와 호출 스택에 푸시한다.
    • 호출 스택이 비어있다는 것은 모든 동기식 코드가 실행을 완료했다는 것이다.

예제 시나리오

  • 아래 예제 시나리오 코드를 실행하면 Sync job 이 먼저 출력된 뒤 비동기 호출인 Async job 이 출력된다.
  • setTimeout() 내부에 있는 콜백은 비동기 작업으로 처리된다.
  • 자바스크립트는 별도의 스레드에서 작업을 처리하는 브라우저 API 혹은 Node.js API 에 이를 전달한다.
  • 동기 코드는 기다리지 않고 계속 실행된다.
  • 동기 코드 실행이 끝나면, 이벤트 루프는 호출 스택이 비어있음을 확인하고 작업 대기열에서 첫번째 콜백을 가져와 호출 스택에 푸시한다.
  • 마침내 비동기 코드가 실행된다.
setTimeout(() => {
  console.log("Async job");
});

console.log("Sync job");

주요 내용

  • 이벤트 루프: 이벤트 루프는 비동기 연산을 오프로드하고 콜백이 실행되는 시점을 관리하여 논블로킹 I/O 를 가능하게 한다.
  • 자바스크립트의 역할: 싱글 스레드로 유지된다.
    • 비동기 연산을 처리하기 위한 멀티 스레드 동작을 제공하는 것은 런타임 환경이다.
  • 효율성: 이러한 설계 덕분에 자바스크립트는 많은 수의 입출력 작업을 효율적으로 처리할 수 있고, 이는 웹서버와 같은 네트워크 집약적 애플리케이션에서 특히 유리하다.
반응형
저작자표시 비영리

'자바스크립트 > 개념' 카테고리의 다른 글

History API 란? (간단 정리)  (0) 2024.02.14
자바스크립트의 싱글 스레드 모델과 이벤트 루프  (0) 2024.01.04
자바스크립트에서 머신 코드 대신 바이트 코드를 사용하는 이유  (0) 2024.01.04
innerHTML vs innerAdajcentHTML() 비교  (0) 2023.07.15
자바스크립트 이벤트(Event) 객체와 커스텀 이벤트 (Custom Event) 란?  (0) 2023.07.07
    '자바스크립트/개념' 카테고리의 다른 글
    • History API 란? (간단 정리)
    • 자바스크립트의 싱글 스레드 모델과 이벤트 루프
    • 자바스크립트에서 머신 코드 대신 바이트 코드를 사용하는 이유
    • innerHTML vs innerAdajcentHTML() 비교
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바