프로그래밍을 동작하는 최고의 단위
프로세스란 프로그래밍을 동작하는 최고의 단위로 컴퓨터(운영체제) 위에서 연속적으로 실행되고 있는 프로그램이다.
각각의 프로세스는 메모리 위에서 독릭접으로 실행되고 리소스 자원들이 할당된다.
Code
: 프로그램을 실행하기 위한 코드
Stack
: 함수의 실행순서, 정보
Heap
: 오브젝트를 생성하면 그 데이터들이 저장되는 공간 (동적으로 할당된 변수)
Data
: 전역변수, static 변수
프로그램안에서 동시에 여러 개가 수행될 수 있는 작은 일꾼 단위
쓰레드란 프로그램안에서 동시 다발적으로 수행되는 작은 일꾼 단위이며 프로세스 하나에는 여러개의 쓰레드가 할당된다.
할당된 쓰레드는 동시 다발적으로 업무를 수행해 프로세스의 효율적인 일처리를 도와준다.
각각의 쓰레드는 일의 흐름을 기억할 수 있는 고유의 stack
이 존재하며 프로세스에 지정된 코드와 데이터 힙들을 공통적으로 접근이 가능하다.
Asynchronous글에서 말했듯 자바스크립트는 Java
, C++
,....등등과는 다른 Single thread
언어다.
하지만 자바스크립트 또한 Web APIs
를 이용하여 Multi thread
를 구현할 수 있다.
즉 런타임환경(자바스크립트가 동작하고 있는 실행 환경)에서 다양한 방식을 통해 Multi thread
과 같은 효과를 얻을 수 있다.
Stack
: 책을 쌓는 것처럼 차곡차곡 쌓아 올린 형태의 자료구조, 늦게 들어온 데이터가 가장 먼저 나가는 후입선출(LIFO : Last In First Out)
Queue
: 줄을 서서 기다리는 형태의 자료구조, 먼저 들어온 데이터가 가장 먼저 나가는 선입선출(FIFO : First In First Out)
자바스크립트 런타임 환경을 이해하기 위해 대표적인 Web APIs함수인 setTimeout함수 예제 코드를 보며 실행 과정을 이해해보자.
setTimeout(() => {
console.log('Hello');
}, 0);
console.log('world');
// world
// hello
자바스크립트는 single thread
언어이기 때문에 코드가 순차적으로 실행된다.
하지만 위 예제 코드의 결과는 예상과는 반대로 world
가 출력된 뒤 hello
가 출력된다.
예제 코드는 다음과 같은 순서로 진행된다.
자바스크립트 엔진은 코드의 평가과정을 거쳐 실행한다.
setTimeout
함수를 call stack
에 push
call stack
에 push
된 setTimeout
함수는 call stack
에서 지워지고 Web API
는 타이머를 시작
타이머를 시작하면 자바스크립트 엔진은 병렬적으로 콜스택을 실행
console.log('world')
를 call stack
에 push
한 뒤 실행
실행이 완료된 console.log('world')
를 call stack
에 pop
지정한 타이머가 종료되어 setTimeout
에 지정한 콜백함수는 Task Queue
에 전달
Event Loop
는 call stack
과 task queue
를 지속적으로 관찰하여 콜스택이 빈 상태이면 Task Queue
에 콜백함수를 call stack
으로 이동시켜 실행
Call stack
과브라우저의 queue
를 관찰하는 감시자
Event Loop
는 Call Stack
과 브라우저의 queue
의 상태를 체크하여, Call Stack
이 빈 상태가 되면, 브라우저의 queue
의 콜백함수를 Call Stack
으로 이동시킨다.
이러한 반복적인 행동을 틱(tick)
이라 부른다.
Task Queue
: Web APIs
에 등록한 콜백 함수를 특정한 이벤트(setTimeout
, click
...등등)가 발생했을 때 Task Queue
에 전달
Microtask Queue
: Promis then
, Web API
인 mutation observer
에 등록된 콜백 함수를 Microtask Queue
에 전달
Render Queue
: 브라우저에서 요소를 움직이거나 애니메이션할 때 주기적으로 화면에 업데이트, 브라우저가 업데이트 되기 전 실행할 콜백함수를 Request Animation Frame
에 전달
Event Loop
는 해당 코드를 구현한것과 동일while(true) {
// do something
}
Event Loop
는 Call Stack
에서 함수가 종료될때까지 이동하지 않고 대기
Call Stack
의 함수가 모두 종료되면 Event Loop
는 다시 동작
Call Stack
이 비어있을 때 Event Loop
는 Microtask Queue
를 Task Queue
보다 먼저 Call Stack
에 넣고 Render Queue
는 화면을 업데이트 하기 위해 주기적으로 호출
Task Queue
: Event Loop
는 Task Queue
의 있는 작업을 확인하면 단 하나의 작업만 콜 스택으로 이동시킨다. 그리고 작업이 끝나면 다른 작업을 가져오는 것이 아니라 다시 순회를 시작
Microtask Queue
: Event Loop
가 Microtask Queue
의 작업을 확인하면 모든 작업이 종료될때까지 이동하지 않고 대기한다. 그리고 작업 실행 중 새로운 작업이 들어오게 된다면 그 작업까지도 끝날때까지 대기
Render
: 초당 60frame
을 구현하기 위해 이벤트루프는 Render
에 머물러있지 않고 적당한 주기로 확인하며 Render Tree
를 업데이트
이벤트 루프 - JavaScript | MDN
모던 자바스크립트 Deep Dive
모던 JavaScript 튜토리얼