ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Event Loop
    위코드x원티드 2021. 8. 14. 13:52

    JS 는 싱글 스레드 언어이다. JS 엔진은 메모리 구조로 Memory Heap 과 Call Stack 을 가진다

    - Memory Heap 에서는 메모리 할당이 일어난다. 변수, 객체, 함수 등등 을 메모리에 할당한다

    - Call Stack 은 코드가 실행됨에 따라 스택 프레임이 쌓이는 공간이다. 우리가 프로그램의 어느 위치에 있는 지 알려주는 자료구조이다

    JS 에 Call Stack 은 1개 뿐이므로, 한 번에 1가지 일밖에 하지 못한다. 뭔가 비동기적인 일이 필요할 때 Blocking 없이 어떻게 처리할 수 있을까? 다행히 JS 엔진이 제공하지 않는 것을 브라우저가 제공하고 있다

     

    그것은 바로 Web API! Web API에는 DOM API, AJAX, fetch, setTimout, Http Request 같은 것들이 있다. Web API 는 비동기적인, blocking 이 없는 동작을 만들 수 있게 해준다

     

    JS 가 브라우저에서 실제 동작할 때는 JS 엔진만 있는 게 아니라, 브라우저의 Web API 와 Callback Queue와 Event Loop 가 함께 동작하는 것이다

    from https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf

    JS 에서 function 을 호출하면, 그것은 Call Stack 에 쌓인다. (위에서 보았듯 Call Stack 은 JS 엔진의 일부다) Stack 은 선입후출 방식이다. function 이 결과값을 return 하면, Stack 에서는 빠져 나온다

     

    from https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif

    respond 함수가 setTimeout Function 을 리턴한다고 하면, setTimeout 은 Web API 에 의해 동작한다. 이 메소드는 JS 메인 스레드에 blocking 없이 작업을 지연시켜준다

     

    from https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif

    Call Stack 에서는 값을 반환한 respond 함수, setTimeout 함수가 모두 빠져나간다. setTimout 함수의 callback 함수는 Web API 에 추가된다. Web API 에서 설정한 시간만큼 기다린다. JS 엔진과 상관없이 동작하는 것이다

    설정한 시간이 다 흐르고 나서, 이 callback 함수는 바로 Call Stack 에 추가되는 것이 아니다. 대신 Queue (= Callback Queue) 에 추가된다. Queue 에서 자기 차례가 될 때까지 기다린다. 그 다음 동작의 핵심역할을 하는 것은?

     

    Event Loop 이다! Event Loop 의 역할은 Queue 와 Call Stack 을 연결하는 것이다. Call Stack 이 비어있다면(=이전에 호출된 함수들이 모두 제 값을 반환했다면), Event Loop 는 Queue 의 가장 첫번째 아이템을 Call Stack 으로 넘겨준다 Queue 는 선입선출로 Call Stack 과 다른 방식으로 동작한다

    이제 Call Stack 으로 넘어간 callback 함수는 제 값을 반환하고 Call Stack 에서 빠져나오게 되는 것이다!

     

     

    예를 들어 수업시간에 배웠던 예시를 살펴보겠다

    setTimeout(function() {
        console.log('1');
    }, 0); 
    
    console.log('2');
    
    for (let i = 0; i < 3; ++i) {
        loop();
    }
    
    setTimeout(function() {
        console.log('3');
    }, 0); 
    
    console.log('4');
    
    function loop() {
        console.log('5');
    }

    setTimeout 함수는 WebAPI 에 콜백함수를 추가하고, JS 의 Call Stack 에서는 바로 빠져나온다. (딜레이 시간이 0 이더라도) 콜백함수는 Web API 에 추가되어 딜레이 시간만큼 동작한 후에 Callback Queue 에 추가된다. 그 사이 Call Stack 에는 console.log('2'), loop() 함수 등등 동기함수들이 동작한다. Call Stack 이 완전히 빈 상태일 때 Event Loop 가 Callback Queue 에 있는 아이템을 앞에서부터 차례로 Call Stack 에 넣는다. 따라서 동기 함수가 완전히 실행이 끝난 다음에 콜백함수가 실행되는 것이다. 그래서 정답은 2555413

     

    참고

     

    '위코드x원티드' 카테고리의 다른 글

    React Router  (0) 2021.09.06
    쉅정리 실행 컨텍스트, Closure, Hoisting, Scope, this  (0) 2021.08.18
    브라우저 동작 원리  (0) 2021.08.14
    수업 정리  (0) 2021.08.08
    Infinite Scroll 구현  (0) 2021.07.28

    댓글