궁금한게 많은 개발자 노트

자바스크립트와 Event Loop 본문

Language

자바스크립트와 Event Loop

궁금한게 많은 개발자 2022. 3. 31. 14:37

node를 잘 이해하기 위해서는 자바스크립트의 동시성 모델에 대해 잘 이해해야 함

자바스크립트의 실행 모델은 event loop, call stack, callback queue 개념으로 이루어짐

 

event loop :

이벤트 루프 모델은 여러 스레드를 사용 -> 우리가 작성한 자바스크립트 코드가 실행되는 스레드가 메인 스레드

한 node.js 프로세스에서 메인 스레드는 하나이며, 한 순간에 한 줄씩 실행 (그 외의 일을 하는 워커 스레드 여럿 존재)

ex) file I/O, network, etc

 

call stack : 

이벤트 루프가 다음 콜백을 처리하려면 지금 처리하고 있는 콜백의 실행이 완전히 끝나야 함

call stack이 완전히 빌 때까지 처리한다는 것과 동일 (run to completion)

 

callback queue :

콜백 큐는 앞으로 실행할 콜백(함수와 그 인자)들을 쌓아두는 큐

콜백은 브라우저나 node가 어떤 일이 발생하면(event) 메인 스레드에 이를 알려주기 위해(callback) 사용 됨

이벤트는 파일 처리 완료, 네트워크 작업의 완료, 타이머 호출 등

ex) 브라우저나 노드가 이벤트 발생시 콜백을 콜백 큐에 넣어주고 콜스택이 비었을때 콜백을 콜스택에 넣어 실행

타이머 이벤트에서 1초마다 콜백을 콜백큐에 넣어주고 있는데, 한 콜백이 실행되는 콜스택이 비워지지 않으면 계속 콜백큐에 쌓여도 실행될 수 없는 상황이 나온다(메인스레드에서 실행될 수 없음) => event loop block

메인 스레드에서 sync로 실행되어야하는 작업을 실행하면 콜백 큐에서 절때로 다른 콜백을 꺼내서 실행할 수 없음(주의) node에서 자랑하는 비동기성을 사용할 수 없는 상황

 

non-blocking I/O & offloading :

메인스레드에서 file 입출력과같은 동기성 업무를 수행하지 않고, 워커스레드로 넘긴다 ex) fs.readfile(fileName, (err,data) -> {}) sometask()

브라우저나 node.js에서나 web api / node api의 동작이 끝나면 callback queue에 등록하고, 브라우저나 node가 요청 받은 일을 하고 있는 동안 멩니 스레드와 이벤트 루프는 영향을 받지 않고 계속 실행

이를 offloading이라고 하며, node서버의 메인 스레드가 하나임에도 불구하고 빠르게 동작할 수 있는 이유

메인스레드는 비지니스로직의 중요한 일만 수행하고, 무거운 일들은 노드가 효율적으로 하도록 분산 처리 -> 메인 스레드가 오래 걸리는 일을 기다리지 않기 때문

1. callback queue에서 콜백을 꺼내고(없다면 생길때까지 기다리고)

2. 그 콜백의 처리가 끝날 때까지 실행하고

3. 이를 반복

# 메인 스레드에서는 한 줄씩 수행하면서 워커스레드에 업무를 다 맡기고, 워커스레드에서 메인 스레드에게 알려줄 것이 잇다면, callback queue에 넣어두고 call stack이 비면 callback queue에서 하나씩 꺼내와 수행함

 

 

'Language' 카테고리의 다른 글

자바스크립트 closure  (0) 2022.04.01
자바스크립트 Hoisting - var  (0) 2022.03.31
[ C++98, 03, 11, 14, 17 ]  (0) 2021.06.18
[ C/C++ ] include header 작성법  (4) 2020.12.09
[ C ] scanf 공백 및 원하는 형태 입력받기  (0) 2020.10.30
Comments