티스토리 뷰

용어 정리

Call Stack : 코드가 실행될 경우 하나씩 stack의 형태로 쌓이는 곳. LIFO(Last In First Out)

Memory Heap: 메모리 할당이 일어나는 곳. (객체들이 할당)

Web API: 브라우저에서 제공하는 API들, 웹 브라우저에 내장되어 있다. ex) DOM, Ajax, setTimeout 등등..

Single Thread(단일 스레드): 동시에 하나의 일만 가능하다. ex) Javascript

Callback Queue: 처리할 메시지 목록인 메시지 대기열, FIFO(First In First Out)

  • Task Queue 
    ex) setTimeout
  • Job Queue(Micro Task Queue)  태스크 큐보다 우선순위가 높다.
    ex) Promise의 .then()
  • Animation Frames
    ex) requestAnimationFrame API

Event Loop (얘 땜에 싱글 스레드이지만 비동기 가능)
: 이벤트 루프는 Call Stack에 현재 실행중인 실행 컨텍스트가 있는지,
Task Queue에 대기중인 함수가 있는지 반복적으로 확인
콜스택이 비어있다?  => 큐에 대기중인 함수가 있는지 확인 후 여러개라면 순차적으로 콜스택에 push

 


동기(synchronous) vs 비동기(asynchronous)

동기

- 한줄 한줄 실행되는 것. 즉, 현재 실행중인 것이 끝날때까지 다음 코드 실행 불가능.

console.log("1");
console.log("2");
console.log("3");

// 출력순서 1 -> 2 -> 3

 - 위에서 아래로 차례로 코드실행

 

비동기

- 코드가 순서대로 실행되지 않으며, 실행중인 코드가 완료되지 않았음에도, 다음코드가 실행된다.

console.log("1);

setTimeout(() => {
	console.log("2");

}, 0);

console.log("3");

// 이 아래로 수백줄의 코드가 있다해도 setTimeout이 가장 나중에 실행

이번에도 출력이 1, 2, 3 순서로 나올거라고 예상하셨겠지만, 1, 3, 2가 출력

왜? setTimeout이 비동기 함수(API)이기 때문 

동작원리
setTimeout()호출 시  Call stack으로 들어갔다가 지정한 초가 지나고 나면 Task Queue로 들어가서 나머지 동기적 코드가 전부 실행되기를 기다린다.
=> Call stack이 비어야 Event Loop가 Task Queue에 있던 콜백함수를 콜스택에 push

 

요약

동기 : 코드가 간단하여 직관적일 수 있음 but, 결과를 반환할때 까지는 아무것도 못하고 대기해야함.
비동기 : 코드가 직관적이지 않아, 복잡하지만 결과를 반환하기 전까지 다른 작업을 할 수 있기 때문에 자원 효율적으로                사용 가능

 


JS 작동원리

 

JS를 실행하기 위해선 JS엔진이 필요하다. JS엔진은 V8, Rhinom SpiderMonkey등 다양하게 있지만 이중에서 가장 대표적인 예로는 Google에서 만든 V8엔진이다.

엔진은 위 그립과 같이 두 가지 구성요소로 구성된다. 메모리힙은 메모리 할당이 발생하고, 콜스택은 코드 실행에 따라 스택이 하나씩 쌓이는 곳이다.

JS를 사용하다 보면 setTimeout()같은 수많은 API를 사용한다. 이런 API들은 Web API라고 웹 브라우저 혹은 node.js같은 JS런타임에서 지원해주는 API이다. 그래서 어떤 브라우저는 지원을 안해줄 수도 있다.

그런데 JS는 위에서 나온 setTimeout()과 같은 비동기 코드 작성이 가능함에도, 자바스크립트 자체에는 비동기 코드를 처리하기 위한 개념은 갖고있지 않다. 그런데 어떻게 비동기 처리를 하냐? 바로 Event Loop & Callback Queue 덕분이다.

Web API 와 더불어 웹 브라우저나 런타임에서는 Event Loop와 Callback Queue도 지원해준다.

 

코드가 실행됨에 따라 콜스택에 차곡차곡 쌓이게 된다.  그 중 비동기 함수들은 Web API로 보내져 처리된다.

Web API에서 작업을 완료한 비동기 함수들을 Callback Queue에 넘겨주게 된다. 여기서 Event Loop는 콜스택이 빈 상태를 확인하게 되면 Callback Queue에 있는 비동기 함수들을 Call Stack에 push 해준다.(우선순위 : Job Queue 다음이 Task Queue) 그 후 Call Stack에서 비동기 함수를 실행시키게 된다.

 


JS는 Single Thread인데, 비동기가 어케 가능???

 

Event Loop 때문이다.

Task Queue와 Job Queue(microtask queue)의 우선순위는 Job Queue가 더 높다.

따라서 Event Loop가 콜스택이 비었다는 것을 확인 후 Job Queue의 함수들을 순차적으로 콜스택에 push 해준다.

그 다음이 Task Queue이다. 

 


Promise

기본형태

const promise = new Promise(function (resolve, reject) {
	if() {
    	resolve("성공");
    }
    else {
    	reject("error");
    }
   });
프로미스의 상태 의미 상태 변경 조건
pending 비동기 처리가 아직 수행되지 않은 상태 프로미스가 생성된 직후
fulfilled 비동기 처리가 수행된 상태(성공) resolve 함수 호출
rejected 비동기 처리가 수행된 상태(실패) reject 함수 호출

후속 처리 메소드로는 .then .catch .finally 가 있다.

후속 처리 메소드는 항상 프로미스를 반환한다.

'개발공부 > 기술면접 대비' 카테고리의 다른 글

[JS] this  (0) 2023.03.23
[JS] 실행 컨텍스트(Execution Context)  (0) 2023.03.22
[JS] 클로저(Closure)  (0) 2023.03.21
[JS] 스코프  (0) 2023.03.21
[JS] var, let ,const 차이  (0) 2023.03.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함