[JS] EventLoop란?

IRE_0546·2021년 9월 3일
1

JavaScript 정복

목록 보기
1/2
post-thumbnail

이벤트 루프 (참고)

자바 스크립트는 이벤트 루프에 기반한 동시성 모델이다.

이벤트 루프는 코드 실행과 이벤트 수집, 처리, 큐에 높인 하위 테스크의 실행을 담당한다.

→ 간단히 말해서, 이벤트 루프는 테스크가 들어 오기를 기다렸다가 들어오면 이를 처리하고. 테스트가 없는 경우에는 잠드는. 끊임없이 돌아가는 자바 스크립트 내의 루프이다.

자바 스크립트는 단일 스레드 언어이다.

그러나 자바 스크립트의 동시성을 지원하는 방법은, 이벤트 루프 덕이다. 즉 자바스크립트는 이벤트 루프를 이용해서 비동기 방식으로 동시성을 지원한다.

Keyword: 동시성 모델, 메인 스레드인 이벤트 루프가 싱글 스레드, 루프, 비동기 방식으로 논-블로킹 IO를 지원한다.

블로킹 (Blocking)

task가 실행되면 끝날 때까지 기다려야 한다. 그러나 논 블로킹 모델은 여러개의 테스크를 동시에 처리할 수 있어서 동시성 모델이라고 한다.

이벤트 루프

→ 노드와 크롬에서는 주로 여러 개의 스레드가 사용되는데, 이러한 여러 스레드들이 싱글 스레드를 사용하는 자바스크립트 엔진과 상호작용을 통해 사용하는 장치가 이벤트 루프라고 한다.

비동기 처리나, 동시성 처리는 자바스크립트 구동 환경인 브라우저나 Node.js가 담당.

브라우저 환경은 어떻게 구성되어있나?

Heap & Stack

Heap - 동적 메모리 관리, Stack - 실행 컨텍스트 적재
이벤트들을 웹에서 작업을 수행할 수 있도록 하는 영역이 따로 정의되어 있으며, 이벤트 루프와 테스크 큐도 자바스크립트 엔진 외부에 구현이 되어있다.

Queue

콜백 함수들이 대기하는 선입선출 구조의 배열, 여기에 Web API를 사용하여 task가 생성되어 이동하고, 적재되는 곳이다.

Event loop → Stack이 비웠을 경우, Queue에서 대기하고 있는 테스크를 스택으로 전달한다.

  • 싱글 스레드
    스레드: 프로세스(운영체제로부터 자원을 할당받는 작업의 단위)가 할당받은 자원을 이용하는 실행의 단위이다.

  • 정의
    하나의 프로세스에서 하나의 스레드를 실행하는 것, 하나의 레지스터와 스택으로 표현한다.

  • 장점
    자원 접근에 대한 동기화를 신경쓰지 않아도 된다. 멀티 스레드와 같은 경우에 공유된 자원을 이용할 경우에는 접근에 대한 제어가 필요하기 때문이다. 작업 전환 작업을 요구하지 않는다.

  • 단점
    여러개의 cpu를 활용하지 못한다. 따라서 단순히 cpu만을 사용하는 계산 작업이라면 싱글 스레드로 프로그래밍 하는 것이 더 효율적이다.

자바 스크립트는 왜 싱글 쓰레드인가?

자바스크립트의 메인 스레드인 <이벤트 루프>가 싱글 쓰레드이기 때문에 자바스크립트를 싱글 스레드 언어라고 부른다.
그러나 이벤트 루프만 독립적으로 실행되지 않고 웹 브라우저나 Node.js같은 멀티 스레드 환경에서 실행이 된다.

즉, 언어 자체는 싱글 스레드이지만 자바스크립트 런타임은 싱글 스레드가 아니다.

기다리지 않고 다음 작업을 동시에 실행하는 비동기 호출로 극복한다.

자바스크립트 실행 과정

Call Stack: 자바스크립트에서 수행해야 할 함수들을 순차적으로 스택에 담아서 처리한다.
Web API: 웹 브라우저에서 제공하는 API로 AJAX나 Timeout 등의 비동기 작업을 실행한다.

Task Queue: Callback Queue라고도 하며, Web API에서 넘겨받은 Callback 함수를 저장한다.

Event loop: Call Stack이 비어있다면 Task Queue의 작업을 Call Stack으로 옮긴다.

자바스크립트는 <왜> 싱글 스레드일까?

이유는 바로 ‘쉬워서’이다. 만약에 멀티 스레드로 실행되는 언어였다면 페이지에서 발생하는 동시성 문제에 대해 해결해야 한다. 이미 크롬 브라우저 마저도 기존 웹 페이지 내에서 엄청난 동시성을 일으킬 수 있다는 문제로 단일 웹 페이지의 js코드가 동시에 실행되는 것을 허용하지 않는다.

profile
Front-end developer, Time is flying never to return ✨

0개의 댓글