frontend/JavaScript

[JS] 자바스크립트와 싱글 쓰레드.

findTheValue 2021. 7. 22. 19:50

JS는 싱글 쓰레드

자바스크립트의 메인 쓰레드인 이벤트 루프는 싱글 쓰레드이다.

하지만 이벤트 루프만 독립적으로 실행되지 않고 웹 브라우저나 NodeJS같은 멀티 쓰레드 환경에서 실행된다.

즉 JS는 싱글쓰레드지만 JS런타임은 싱글 쓰레드가 아니다.

싱글쓰레드로 병렬처리를 하는 방법.

기존 동기식 요청은 코드를 한줄 한줄 차례로 실행한다.

하지만 이렇게 되면 앞의 작업시간이 길수록 병목이 생기고 시간과 자원이 낭비된다.

요청이 완료될때까지 기다리지 않고 다른작업을 비동기 호출로 수행한다.

JS의 비동기 런타임.

1.png

  • Call Stack: 자바스크립트에서 수행해야 할 함수들을 순차적으로 스택에 담아 처리(메인 스택)
  • Web API: 웹 브라우저에서 제공하는 API로 AJAX나 Timeout등의 비동기 작업을 실행(대기공간)
  • Task Queue: Callback Queue: Web API에서 넘겨받은 Callback함수를 저장(대기가 끝나면 stack에 진입하기위한 queue)
  • Event Loop: Call Stack이 비어있다면 Task Queue의 작업을 Call Stack으로 옮김

web api가 처리하는 함수는 Timeout, ajax함수, eventlistner등이 해당. 처리해서 콜백함수로 큐에올림.

event loop는 호출 스택이 비었는지 항상 확인하는 존재.스택이 비었으면 큐에 대기하던 콜백함수를 스택으로 올린다.

싱글 쓰레드의 장점.

  • 쉽다. : 멀티 쓰레드로 실행되는 언어면 웹에서 발생하는 동시성 문제에 대해 해결해야 한다. 하지만 JS는 인해 교착 상태 같은 다중 쓰레드 환경에서 발생하는 문제들을 신경쓸 필요가 없고 비동기를 통해 쉽게 여러 요청을 처리할 수 있다.

    구글의 크롬도 동시성 문제를 이유로 JS의 멀티쓰레드를 지양.

  • 개발자가 동시성에 의해 발생되는 복잡한 문제들을 고려하지 않고도 쉽게 서비스를 만들 수 있다.