본문 바로가기

DEVELOP

[Javascript] 싱글스레드인데 비동기함수를 처리할 수 있는 이유

728x90

결론 부터 말하면, 단순하게 Javascript만으로 비동기함수를 처리할 수 없다.

런타임환경(Web APIs)에 비동기 작업을 위임하여 대신 처리할 동안 다른 코드를 처리한다. 따라서 동시성을 갖는다.

대신 처리해 준 것을 그 외의 자바스크립트 코드를 해석, 실행하는 Javascript 엔진의 작업이 끝난 후에 실행을 시켜준다.

 

Javascript하나의 메인스레드하나의 콜스택을 갖는다.

그렇기에 Javascript만으로 비동기 작업을 처리 할 수 없다.

 

Javascript가 싱글스레드라는 예)

  • alert를 발생 시키면, 그창의 확인을 누르기전까지 UI조작이 불가능하다.
  • Javascript가 Rendering Engine인 런타임환경(Web APIs, Node.js)에 비동기 작업을 위임하여 그들이 대신 처리 ->
  • 이벤트 루프가 Web APIs가 작업해둔 비동기 작업을 임시 대기하는 태스크 큐(콜백 큐)에 옮긴다 ->
  • Javascript의 콜스택이 동기 작업을 하는 동안 이벤트 루프가 확인 후 동기 작업 진행중인거나 콜스택에 쌓인 작업이 없는 것 확인 ->
  • Web APIs가 작업해둔 비동기 작업(콜백 함수)을 콜스택에 옮겨 Javascript가 작업이 된 비동기작업을 뿌려준 후 완료

 

  • 엔진의 종류
    • 자바스크립트 엔진 (Javascript Engine) : Google V8(c++로 작성된 언어) : 동기 작업 실행.
      • 힙(Heap) : 동적 생성된 객체 처리
      • 콜스택(Call Stack) : 동기 작업 실행
    • 렌더링 엔진 (Rendering Engine) : 런타임환경(브라우저, Node.js) : 비동기 작업 실행.
  • 작업의 종류
    • 비동기 작업 : 작업이 실행되고 그 작업을 마치지 않아도 다른 작업 동시에 실행 가능. 언블로킹(제어권을 자신을 호출한 쪽에 넘기고 그 쪽에서 다른일을 실행할 수 있도록 하는 것).
    • 동기 작업 : 작업이 실행되고 완료 될때까지 다른 작업 동시에 실행 불가능. 블로킹(자신의 수행결과 끝날때까지 제어권을 갖음) 특징을 갖는다.

싱글스레드 <-> 멀티스레드로, 멀티스레드의 언어 중 C언어가 있다.