자바스크립트/개념

자바스크립트의 싱글 스레드 모델과 이벤트 루프

Jake Seo 2024. 1. 4. 23:10

싱글 쓰레드 모델과 Event Loop

논블로킹과 Event Loop 에 대한 간단한 설명

  • Blocking 요청과 Non-Blocking 요청에 대한 처리가 다름
  • Non-Blocking 요청이 들어왔을 때는 이벤트 루프에 담아서 처리함
  • Blocking 요청일 때는 워커 스레드에게 맡김

자바스크립트의 싱글 스레드 모델

작동 방식

  • 싱글 스레드: 한 번에 하나의 연산을 단일 시퀀스로 처리함
  • 실행 컨텍스트: 자바스크립트 코드가 실행되면, "실행 컨텍스트 (Execution Context)" 에서 실행함. 실행 컨텍스트는 코드가 실행되는 순서를 처리함.
  • 호출 스택 (Call Stack): 실행 컨텍스트 관리를 위해 콜스택을 사용함. 콜스택은 프로그램에서 현재 위치를 기록하는 데이터 구조로 사용됨. 가장 최근에 호출된 함수가 가장 상위에 있음. 함수가 완료되면, 스택에서 제거되고 프로그램은 중단된 부분부터 실행함.

장점

  • 단순성: 교착 상태(Deadlock)나 경쟁 상태(Race Condition) 같은 복잡한 문제 처리가 필요 없음. 프로그래밍 모델을 단순화 가능.
    • 그래도 CPU 를 사용하는 작업은 여전히 이벤트 루프에서 실행되어 병목 현상이 발생할 수 있다.
    • 최신 버전의 Node.js 는 실험적 기능으로 작업자 스레드(Worker Threads) 라는 것을 도입하여 일정 수준의 멀티 스레딩을 허용한다. 이를 이용하면 자체적인 복잡성이 수반된다.
    • 또, Node.js 는 CPU 집약적인 작업을 처리하기 위해서 자식 프로세스를 생성할 수도 있다.
  • 일관성: 실행 순서의 일관성을 보장. 이는 웹앱의 UI 및 상태 관리에 중요함.

단점

  • 작업 차단: 한 번에 한가지 작업만 수행 가능해서 오래 걸리는 작업이 메인 스레드를 차단해 UI가 응답하지 않아 사용자 환경이 저하될 수 있음.

자바스크립트의 이벤트 루프

작동 방식

  • 논 블로킹 I/O: 자바스크립트는 싱글 스레드임에도 불구하고 non-blocking I/O 연산을 수행할 수 있음. 이는 자바스크립트가 비동기 콜백을 사용할 수 있게 해주는 이벤트 루프를 통해 이뤄짐.
  • 이벤트 루프 매커니즘: 이벤트 루프는 호출 스택이 비어있는지 지속적으로 확인함. 비어 있으면 메세지 큐에서 실행을 기다리는 보류 중인 콜백이 있는지 확인. 대기 중인 콜백이 있으면 콜백을 제거하여 호출 스택으로 푸시한 다음에 실행.

장점

  • 비동기 동작: 자바스크립트가 메인 스레드를 차단하지 않고, 웹 API 요청과 같은 긴 I/O 작업을 비동기적으로 수행할 수 있게 해줌.
  • 성능 향상: 이벤트 루프의 non-blocking 특성으로 인해 웹앱의 성능이 향상되고 UX 가 좋아진다.

단점

  • 디버깅의 복잡성: 비동기 코드는 비선형적인 실행 흐름을 가져 이해와 디버깅이 어려울 수 있다.
  • 콜백 지옥의 가능성: 콜백에 대한 의존도가 높으면 콜백 지옥을 겪을 수 있다.
반응형