본문으로 바로가기

[JS] 콜스택과 이벤트루프

category WEB/JS 2019. 2. 22. 01:56

V8엔진은 크게 메모리 할당이 이루어지는 메모리힙과 콜스택으로 이루어져있다. 거기에 더해 브라우저에서의 웹API와 이벤트루프, 콜백큐가 존재한다.

 

자바스크립트는 싱글쓰레드 프로그래밍 언어이므로, 콜스택은 하나만 존재한다. 즉, 한번에 하나의 일만 할 수 있다. 함수가 실행되면 해당 함수는 콜스택 위에 차곡차곡 쌓이고, 실행이 끝나면 가장 윗부분의 것이 POP된다. 만약 함수가 함수를 계속 재귀로 불러와 스택이 넘칠 경우 스택이 오버플로우된다.

 

싱글쓰레드는 데드락과 같은 멀티쓰레드 기반 환경에서 대처해야하는 상황을 신경쓰지 않아도 되는 장점이 있지만, 동기적이기 때문에 앞선 함수가 실행되는 동안에는 뒤 함수가 처리되지 않는다는 단점이 있다. 뒷 작업이 블로킹 되는 것이다.

 

때문에 지금 당장 완료될 수 없는 작업은 비동기 처리를 통해 논블로킹하게 처리한다. 이러한 비동기 처리에 사용되는 것이 콜스택, 프로미스 등이다.

 

여기에서 앞서 말한 이벤트루프와 콜백큐가 필요하다. setTimeout이나 AJAX 처리가 발생할 경우, 콜스택으로 들어간 해당 함수는 웹API로 들어가고, 콜스택에서 빠져나온다. 그리고 나머지 당장 완료될 수 있는 작업들이 차례로 콜스택으로 들어갔다 나오며 완료된 후, 웹API에서의 작업이 끝나면 해당 함수는 콜백큐로 이동한다. 그리고 이벤트루프는 콜백큐에 함수가 있을 경우 해당 함수를 받아 콜스택에 넣는다. 그리고 차례로 함수 내 작업이 실행되면서 콜스택에서 빠져나온다.

 

자바스크립트는 어떻게 작동하는가: 엔진, 런타임, 콜스택 개관

자바스크립트는 어떻게 작동하는가: 이벤트 루프와 비동기 프로그래밍의 부상