Elice SW 2/TIL
DAY 17 - TIL
자이구
2022. 4. 28. 20:51
JS 제어 흐름
- JS는 다른 멀티스레드 프로그래밍 언어(JAVA/C++)와 다른 방식으로 비동기 동작을 처리
- JS엔진은 하나의 메인 스레드로 구성
- 메인 스레드는 코드를 읽어 한 줄씩 실행되고 브라우저 환경에서 유저 이벤트를 처리하고 화면을 그림
동기적 제어 흐름
- 동기적 제어 흐름은 현재 실행 중인 코드가 종료되기 전까지 다음 줄의 코드를 실행 하지 않는 것
- 분기문, 반목문 , 함수 호출 등이 동기적으로 실행
- 싱글 스레드 환경에서 메인 스레드를 긴 시간 점유시, 프로그램이 멈춤
- 멀티 스레드 환경에서는 메인 스레드를 긴 시간 점유해도 프로그램이 멈추지 않음
비동기적 제어 흐름
- 비동기적 제어 흐름은 현재 실행 중인 코드가 종료되기 전에 다음 줄의 코드를 실행하는 것
- 프로미스, 콜백 함수를 호출하는 함수 등은 비동기적으로 실행
- 비동기 작업을 기다리는 동안 메인 스레드는 다른 작업을 처리
이벤트 루프
- JS 엔진은 비동기 처리를 제공하지 않음
- 비동기 코드는 정해진 함수를 제공하여 활용, 이 때의 함수를 API라 함
- 비동기 API의 예시로 setTimeout, XMLHttpRequest, fetch 등의 Web API가 있음
- node.js의 경우 파일 처리 API, 암호화 API 등을 제공
Event Loop
비동기 코드가 끝났을 때 메인 쓰레드가 콜스택을 비웠다고 가정시(=모든 코드가 실행되어 콜스택 비워짐)
이벤트 루프는 Task Queue를 체크해 Task를 콜스택에 넣어 코드를 실행
비동기 처리 모델
- 비동기 코드를 처리하는 모듈은 JS 엔진 외부에 있음
- Event Loop, Task Queue, Job Queue 등으로 구성
- API모듈은 비동기 요청을 처리 후 태스크 큐에 콜백 함수(Task)를 넣음
- JS 엔진은 콜 스택이 비워지면, 태스크 큐의 콜백 함수를 실행
- Task Queue는 콜백함수가 들어온 순서대로 함수를 내보냄--> Queue 성질