
자바스크립트(Javascript)는 싱글 스레드 언어이다. 즉, 한번에 하나의 작업만 수행이 가능하다.
그런데 웹 애플리케이션(Web Application)에서는 작업들을 멀티로 처리해야 하는 경우가 많다.
따라서 오래걸리는 네트워크 요청이나, 함수 스케쥴링(타이머 함수), 애니메이션 등의 오래걸리는 작업들은
자바스크립트 엔진을 이용하지 않고, 브라우저 내부의 멀티 스레드로 작동하는 Web APIs를 이용한다.
여기서는 비동기 + 논 블로킹으로 처리된다.
먼저 비동기와 논 블로킹의 개념에 대해 살펴보자.
동기 / 비동기 (Synchronous / Asynchronous)
**동기(Synchronous)**는 작업 시간을 함께 맞춰서 실행한다는 의미로 해석된다.
즉, 요청 작업에 대해 완료 여부를 따져 순차대로 처리함을 의미한다.
**비동기(Asynchronous)**는 요청한 작업에 대한 완료 여부를 따지지 않고,
자신의 다음 작업을 그대로 수행하는 것이다.
즉 프로세스 A와 프로세스 B가 있고, A -> B 형태로 작업 흐름이 이루어질 때
동기는 작업 B가 완료되어야 A의 다음 작업을 수행할 수 있고
비동기는 작업 B의 완료 여부와 상관없이 바로 다음 작업을 수행하는 것이다.
비동기의 성능
보통 비동기의 성능을 이야기할 때, 요청한 작업에 대해 완료 여부를 신경쓰지 않기 때문에
I/O 작업 같은 느린 작업이 발생 시, 기다리지 않고 다른 작업을 처리하면서 동시에 처리 할 수 있다.
이 때, 멀티 프로세스 및 멀티 스레드 방식을 사용한다.
예를 들어, 데이터베이스 쿼리를 수행하는 작업이 있다고 가정해보자.
이 작업을 동기적으로 수행할 시, 데이터베이스에서 응답이 올 때까지 기다려야 하고,
그러면 웹 애플리케이션은 다른 요청을 처리하지 못해, 대규모 트래픽 발생 시 성능이 저하될 수 있다.
반대로, 비동기 방식으로 수행하면, 데이터베이스에서 응답이 올 때까지 기다리는 동안
다른 요청을 동시에 처리할 수 있게 되어, 대규모 트래픽 관점에서도 용이하다.
비동기 요청을 그림으로 표현하면 아래와 같다.

자바스크립트 같은 경우, 비동기로 작업을 요청하면
브라우저에 내장된 멀티 스레드로 이루어진 Web API로 작업이 인가되어
메인 콜 스택과 작업이 동시에 처리된다.
그 예시로는 애니메이션 처리, 네트워크 통신, 마우스 키보드 이벤트, 타이머 함수 등이 있다.
멀티 프로세스
멀티 프로세스는 운영체제에서 하나의 응용 프로그램에 대해
동시에 여러 개의 프로세스를 실행할 수 있는 기술을 의미한다.

보통 하나의 프로그램 실행에 대해 하나의 프로세스가 메모리에 생성되지만,
부가적인 기능을 위해 여러 개의 프로세스를 생성하는 것이다.
이 내부를 보면, 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성해
한 프로세스가 실행 도중 생성 시스템 콜을 통해 새로운 프로세스를 생성한다.
이 원리는 PID(Process ID)를 통해 이루어지는데, 부모 프로세스는 자식 프로세스의 PID를 알고
자식 프로세스를 제어할 수 있고, 자식 프로세스는 부모의 PID를 알고 있어 통신이 가능하게 되어 있다.
하지만 부모 프로세스와 자식 프로세스는 서로 연결만 될 뿐 독립적인 메모리 공간을 가지고 있어
서로 다른 작업을 수행하고 있다.
이 원리 및 과정은 다음과 같은 장점을 가지고 있다.
1. 프로그램의 안정성
각 프로세스가 독립적인 메모리 공간을 가지므로, 한 프로세스가 비정상적으로 종료되어도
다른 프로세스에 영향을 주지 않아, 프로세스 전체의 안정성을 확보할 수 있다.
2. 프로그램의 병렬성
멀티 프로세스와 여러개의 프로세서를 활용해 각 프로세스를 병렬 실행해 성능을 향상시킨다.
그러나, 이부분은 멀티 스레드의 장점이기도 하므로, 멀티 스레드의 성능 향상이 더 크다고 볼 수 있다.
3. 시스템 확장성
각 프로세스가 독립적이므로, 새로운 기능이나 모듈을 추가하거나 수정할 때 다른 프로세스에 영향이 없다.
그래서 시스템 규모를 쉽게 확장할 수 있다.
예를 들어, 대규모 웹 서비스에서는 수많은 요청을 동시에 처리하기 위해 여러 대의 서버를 두고
로드 밸런서(Load Balancer) 같은 장비를 사용해 클라이언트 요청 트래픽을 분산시킨다.
반대로 멀티 프로세스의 단점도 소개한다.
이 단점 때문에 등장한 것이 이후에 소개할 멀티 스레드 방식이다.
1. 컨텍스트 스위칭 오버헤드
멀티 프로세스를 구성하는데 핵심 기술인 컨텍스트 스위칭 과정에서 성능 저하가 올 수 있다.
특히 컨텍스트 스위칭 시 다음 프로세스 정보를 불러오기 위해
메모리를 검색하고, 캐시 메모리를 초기화하고, 프로세스 상태를 저장하고, 데이터를 준비해야 하므로
빈번한 컨텍스트 스위칭 작업으로 인해 오버헤드가 생길 수 있다는 것이다.
따라서, 컨텍스트 스위칭 오버헤드를 최소화하기 위해 프로세스 수를 적정하게 유지하거나
I/O 바운드 작업이 많은 프로세스와 CPU 바운드 작업이 많은 프로세스를 분리하여 관리하고
CPU 캐시를 효율적으로 활용하는 등의 방안이 있다.
2. 자원 공유 비효율성
멀티 프로세스는 각 프로세스가 독립적인 공간을 가지므로 메모리 사용량도 증가하고,
프로세스 간 자원 공유 필요할 경우, 어려운 기법인 IPC 기법을 사용해야 하므로 비효율적이다.
여기서, 파이프 / 소켓 / 메시지 큐 등 다양한 방법이 사용되는데 IPC 자체로 오버헤드가 발생한다.
예를 들어, 데이터를 복사하거나 버퍼링하는 과정에서 성능 저하가 발생할 수 있고
코드 복잡도를 증가시키기 때문이다.
멀티 스레드
스레드는 하나의 프로세스 내에 있는 실행 흐름이므로
멀티 스레드는 하나의 프로세스 안에 여러 개의 스레드가 있는 것을 말한다.
따라서, 하나의 프로그램(프로세스)에서 2가지 이상의 동작을 처리하는 행위가 가능해진다.

예를 들어, 웹 서버는 대표적인 멀티 스레드 응용 프로그램으로써,
사용자가 서버 데이터베이스에 자료를 요청하는 동안, 브라우저의 다른 기능을 이용하는 것도
멀티 스레드의 기능 예시 중 하나이다.
즉, 하나의 스레드가 지연되더라도 다른 스레드는 작업을 지속할 수 있게 된다.
멀티 스레드와 멀티 프로세스의 큰 차이점은 예시로 표현할 수가 있는데,
멀티 프로세스가 여러 개의 창이라면
멀티 스레드는 단일 탭 또는 한 창 내에서 이벤트 루프, 네트워크 처리, I/O 작업 등을 관리/처리하는 것이다.
멀티 스레드의 장점은 다음과 같다.
1. 스레드는 프로세스보다 가볍다.
스레드는 프로세스 내에서 생성되므로
스레드의 실행 환경을 설정하는 작업이 간단하여 생성 및 종료가 빠르다.
또한 코드, 데이터, 스택 영역을 제외한 나머지 자원을 공유하므로, 내장 데이터 용량이 적다.
그래서 스레드를 생성하고 제거할 때 프로세스 내부 자원만을 관리하면 된다.
2. 자원의 효율성
멀티 스레드는 하나의 프로세스 내에서 여러 개의 스레드가 생성되므로
힙(heap) 영역과 같은 공유 메모리에 대해 스레드 간에 자원 공유가 가능하다.
따라서 통신을 사용하지 않고도 데이터를 공유할 수 있으므로 시스템 자원 소모가 줄어든다.
3. Context Switching 비용 감소
프로세스 컨텍스트 스위칭 비용은 스위칭 때마다 CPU 캐시 내용을 초기화하고
프로세스 정보를 CPU 캐시에 적재해야 하므로 높은 비용이 들었다.
반면 스레드 컨텍스트 스위칭 비용은 공유 자원을 제외한 스레드 정보(Stack, Register)만을
교체하면 되기 때문에 비용이 상대적으로 낮은 것이다.
4. 응답 시간 단축
통신이나 자원 공유가 용이하고, 프로세스보다 가벼워
컨텍스트 스위칭 비용이 작아, 응답시간이 빠르다는 것이다.
예를 들어, 웹 서버에서 클라이언트 요청 처리하는 경우
멀티 프로세스 방식에서는 각 요청마다 프로세스를 생성하여 처리해야 하여 요청 오버헤드가 크다.
반면, 멀티 스레드 방식에서는 여러 개의 스레드가
하나의 프로세스 내에서 요청을 처리하여 오버헤드가 감소한다.
반면에 멀티 스레드에도 단점은 존재한다.
1. 안정성 문제
멀티 스레드 모델은 기본적으로 하나의 스레드에서 문제 발생 시 다른 스레드에도 영향을 받는다.
하지만 이 문제는 프로그래머의 역량으로 충분히 방지할 수 있는데,
스레드에 에러 발생 시 예외 처리를 잘 해놓는다던가
새로운 스레드 생성 혹은 스레드 풀에서 잔여 스레드를 가져와 비정상적 종료를 방지할 수 있다.
다만, 새로운 스레드 처리에 추가 비용이 발생하는 것 또한 단점이다.
2. 동기화로 인한 성능 저하
멀티 스레드 모델은 여러 개의 스레드가 공유 자원에 동시에 접근하므로 동기화 문제가 발생한다.
따라서 여러 스레드들이 자원에 대한 접근을 순차적으로 통제하여 동시 수정 문제를 해결할 수 있다.
그러나 접근 제한 문제가 있어 병목 현상이 일어나 성능이 저하될 수 있다.
이를 해결하기 위해 임계 영역(Ciritical Section)에 대해
뮤텍스(Mutex) 혹은 세마포어(Semaphore) 방식을 이용한다.
※ 임계 영역 : 공유 자원을 접근하는 코드 영역으로써 전역 변수나 heap 메모리 영역 등이 있다.
※ 뮤텍스
공유 자원에 접근 제어에 대한 상호 배제 기법 중 하나로 임계 영역에 진입 전 락(Lock)을 획득하고
임계 영역을 빠져 나올때 락을 해제하여 다른 스레드들이 접근할 수 있도록 하여
오직 1개의 스레드만이 공유 자원에 접근하도록 제어하는 기법이다.
※ 세마포어
동시에 접근 가능한 스레드의 개수를 지정하는 것으로써
값이 2 이상이면 동시에 접근 가능한 스레드의 수를 제어할 수 있다.
스레드가 임계 영역 진입 전에 세마포어 값을 확인하고, 허용된 범위 내에 있을 경우에만 락을 획득한다.
3. 데드 락 (교착 상태)
데드 락(Dead Lock)이란 다수의 프로세스나 스레드가 서로 자원을 점유하고
다른 프로세스나 스레드가 점유한 자원을 기다리는 상황에서 발생하는 교착 상태를 의미한다.
즉, 여러 개의 스레드들이 대기하면서 무한정 기다리게 되는 무한 루프 같은 증상이다.
아래와 같은 그림을 보자.

이 그림에서 스레드 1은 자원 A를 점유하고 있는 상황에서 자원 B가 필요한 상황이다.
그리고, 스레드 2는 자원 B를 점유하고 있는 상황에서 자원 A가 필요한 상황이다.
하지만, 스레드 1은 자원 A를 점유하고 있으므로 자원 A를 빌려줄 수 있는 상황이 아니고,
스레드 2 또한 자원 A가 필요한 상황에서 자원 B를 점유하고 있으나
자원 B를 빌려줄 수 있는 상황이 아닌 것이다.
이러한 현상은 공유 자원에 대한 동시 엑세스 문제로써
이를 방지하기 위해 상호배제, 점유 및 대기, 비선점, 순환대기 알고리즘을 통해 극복한다.
4. 컨텍스트 스위칭 오버헤드
멀티 스레드에서도 컨텍스트 스위칭 오버헤드 비용 자체를 무시할 수는 없다.
스레드 수가 많으면 많을수록 컨텍스트 스위칭이 많이 발생해 이는 성능 저하로 이어진다.
5. 디버깅 어려움
여러개의 스레드가 동시에 실행되므로 각 스레드의 동작을 추적하기 어려울 수 있다.
예를 들어, 코드를 디버깅하는 도중 다른 스레드가 실행되어 예기치 않은 결과가 실행될 수 있다.
또한 어떤 스레드가 언제 어떤 자원에 접근하고 어떤 순서로 실행되는지 파악하기 어려울 수 있다.
따라서, 스레드 간의 상호작용과 동기화 기법을 잘 이해하고, 디버깅 도구를 활용해야 한다.
블로킹 / 논 블로킹 (Blocking / Non Blocking)
블로킹과 논 블로킹의 관점은 다른 요청의 작업을 처리하기 위해 현재 작업의 차단 유무이다.
동기 / 비동기가 전체적인 작업에 대한 순차적인지에 관한 유무라면,
블로킹 / 논 블로킹은 전체적인 작업의 흐름 자체를 막냐 안먹냐에 대한 관점이다.
예를 들어, 파일을 읽는 작업이 있을 때, 블로킹 방식은 파일을 다 읽을 때까지 대기하고,
논 블로킹은 파일을 다 읽지 않아도 다른 작업을 할 수 있다.
더 자세한 예시로, setTimeout 함수를 블로킹 관점에서 해석해보자.
console.log("시작합니다!");
setTimeout(() => { console.log("1초 후에 실행됩니다!"); }, 1000);
console.log("완료되었습니다!");이 코드는 아래와 같이 시작합니다! 와 **완료되었습니다!**가 먼저 출력되고
1초 후에 1초 후에 실행됩니다! 가 출력되는 구조이다.
시작합니다!
완료되었습니다!
1초 후에 실행됩니다!메인 함수 작업에 대해 setTimeout 함수는 자신의 타이머 작업을 수행하기 위해
메인 함수를 블락하지 않고, 백그라운드에서 별도로 처리하였다.
메인 함수를 블락하지 않으니, setTimeout 함수를 호출하고 바로 안의 콘솔 함수를 출력한 것이다.
이 관점에서 setTimeout 함수는 논 블로킹 성질을 가진다.
논 블로킹과 콜백 함수
콜백 함수란, 직접적인 의미로는 함수에 대한 인자로 함수를 받는 것이나
다른 작업의 완료 여부나 후처리로 쓰이는 함수를 의미한다.
여기서 콜백 함수는 비동기 함수와 논 블로킹 함수와 모두 관련이 있다고 할 수 있는데
콜백 함수가 비동기 함수나 논 블로킹 함수라기보다는 비동기 및 논 블로킹을 구현하는 방법 중
하나가 바로 콜백 함수이다. 그 이유는 동기인 콜백 함수도 존재할 수 있기 때문이다.
비동기 및 논 블로킹은 다른 작업의 결과를 기다리지 않고 병렬적으로 실행되는 의미를 갖는데
콜백 함수가 반드시 비동기 및 논 블로킹은 아니지만, 비동기 및 논 블로킹을 구현하는데
콜백 함수가 사용될 수 있기 때문이다.
$.ajax({
url: '...',
type: 'GET',
dataType: 'json',
success: function(data) { // 요청이 성공하면 호출될 콜백 함수
console.log(data);
}
error: function(error) { // 요청이 실패하면 호출될 콜백 함수
console.log(error);
}
});
console.log('Hello'); // 요청을 보내면서 다른 작업을 수행할 수 있음제어권과 블로킹
동기 및 비동기 그리고 블로킹 및 논 블로킹을 구분하기 위해 제어권이라는 용어를 쓴다.
제어권은 간단히 말해서 함수의 코드나 프로세스 실행 흐름을 제어하는 권리 같은 것이다.
호출된 함수(callee)가 호출한 함수(caller)에게 제어권을 주느냐 안 주느냐로 구분된다.
제어권이 넘어가면 해당 함수는 블로킹된다.
블로킹 방식에서는 호출한 함수(caller)가 어떤 함수를 호출하면(callee) 제어권을 넘겨주고
그 때 호출한 함수는 실행을 멈추며, 호출된 함수(callee)가 실행을 마치면 제어권을 돌려주어
그 다음 작업을 실행하는 형태이다.
논 블로킹 방식에서는 반대로 제어권을 넘겨주지 않고, 호출된 함수(callee)가 실행되는 동안에도
호출한 함수(caller)가 계속 자신의 코드를 실행할 수 있다.
동기 / 비동기 + 블로킹 / 논 블로킹 조합들
동기 및 비동기 그리고 블로킹 및 논 블로킹은 유사하지만 다른 의미를 가지고 있어 대부분 조합하여 사용된다.
1. Sync Blocking (동기 - 블로킹)
다른 작업이 진행되는 동안, 자신의 작업을 처리하지 않고 (Blocking)
완료 여부를 받아 순차적으로 처리하는 (Sync) 방식이다.
대표적인 예시로 작은 파일을 받아 순차적으로 처리하는 방식이 예로 들 수 있겠다.
대부분 터미널의 콘솔 창이 이런 방식이다.
2. Async Non-Blocking (비동기 - 논 블로킹)
다른 작업이 진행되는 동안 자신의 작업을 처리하고 (Non-Blocking)
다른 작업의 결과를 바로 실행하지 않아 실행 순서가 지켜지지 않는 (Async) 방식이다.
대표적인 예시로, 파일을 받아 처리할 때, 콜백 함수를 받아 비동기 논 블로킹 방식으로 처리한다.
이 때 작업 순서를 고려하지 않아, 아래의 실행 결과가 먼저 실행될 수도 있다.
비동기 - 논 블로킹의 실생활 예시는 웹 브라우저의 네트워크 통신 방식이라고 할 수 있는데
파일 다운로드를 하는 중에 다른 행동을 할 수 있다는 것에서 그 예를 찾을 수 있다.
3. Sync Non-Blocking (동기 - 논 블로킹)
다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non-Blocking)
다른 작업의 결과를 바로 처리하여 순서대로 처리하는 (Sync) 방식이다.
동기 및 논 블로킹의 예시로는 Java에서 스레드 객체를 만들 때 요청 작업은 계속 돌 수 있지만
그 이후 스레드가 처리되었는지 확인하고 다음 작업을 수행할 수 있다는 점에서 이와 같다.
자바스크립트(Javascript)에서 동기 - 논 블로킹 패턴은 async - await 패턴으로 구현할 수 있다.
여기서 await 키워드를 통해 비동기 작업들을 동기적으로 맞춰주는 것이다.
4. Async Blocking (비동기 - 블로킹)
다른 작업이 진행되는 동안 자신의 작업을 멈추고 기다리고 (Blocking)
다른 작업의 결과를 바로 처리하지 않아 순서대로 수행하지 않는 (Async) 방식이다.
실무에서 마주하지 않아 자주 볼 방식은 아니지만, Node.js + MySQL 조합이 대표적이다.
Node.js에서 비동기 방식으로 데이터베이스에 접근하므로 비동기적(Async)이지만
MySQL 데이터베이스에 접근하기 위한 드라이버가 블로킹(Blocking) 방식이다.
이벤트 루프 (Event Loop)
이벤트 루프(Event Loop)는 브라우저 내부의 콜 스택, 콜백 큐, Web API 등의 요소들을
모니터링하면서 비동기적으로 실행되는 작업들을 관리하고 순서대로 처리하여
프로그램 실행 흐름을 제어하는 관리자이다.
동작 과정을 다음과 같이 살펴보자.
① 자바스크립트의 setTimeout이나 fetch 같은 비동기 코드를 Web APIs에게 맡긴다.
② 백그라운드 작업 (메인 함수 내부의 코드) 이 끝난 결과를 콜백 함수 형태로 큐에 넣는다.
③ 처리 준비가 되면 콜 스택에 메인 함수 내부의 코드를 넣는다.

이러한 이벤트 루프 이용한 프로그래밍 방식을 Event Driven Programming 이라고 한다.
프로그램의 흐름이 이벤트 (사용자의 클릭 등)에 의해 결정되는 방식으로써
이벤트가 발생하면 그에 맞는 콜백 함수가 실행되는 방식이다.
이벤트 기반 프로그래밍은 비동기 작업을 쉽게 처리하고
멀티 스레드 언어에 비해 단순하고 직관적인 코드를 작성하고
브라우저 환경에서도 안정적인 실행을 가능하게 하여 사용자와 상호작용을 높인다.
자바스크립트 엔진 구동
자바스크립트 엔진은 브라우저 및 Node.js 엔진이 있으며, 여기서는 브라우저 기준으로 살펴본다.
브라우저는 웹 사이트를 화면에 보여주기 위해 여러가지 역할을 하는 요소들로 이루어져 있으며,
앞서 실행 컨텍스트를 쌓고 있는 콜 스택, 오브젝트를 저장하는 힙 영역으로 구성되어 있다는 건 배웠다.
비동기 코드의 동작 과정에는 Web APIs와 Event Table, Callback Queue, Event Loop이 있다.
① Web APIs : 브라우저에서 제공하는 API 모음으로 비동기적으로 실행되는 작업을 전담하여 처리한다.
② Callback Queue : 비동기적 작업이 완료되는 실행되는 함수(콜백 함수)가 대기하는 공간
③ Event Loop : 비동기 함수들을 적절한 시점에 실행시키는 관리자
④ Event Table : 특정 이벤트가 발생했을 때, 어떤 콜백 함수가 실행하는지 결정하는 자료구조

1. Web APIs 특징 및 종류
타이머, 네트워크 요청, I/O, 이벤트 처리 등 브라우저에서 제공하는 다양한 API를 포괄한다.
브라우저에서 멀티 스레드로 구성되며, 비동기 작업에 대해 메인 스레드를 차단하지 않고
다른 스레드를 사용하여 동시에 처리할 수 있다.
① DOM : HTML 문서의 구조와 내용을 표현하는 조작하는 객체
② XMLHttpRequest : 서버와 비동기적으로 데이터를 교환하는 객체 (AJAX)
③ Timer API : 일정한 시간 간격으로 함수를 실행하거나 지연시키는 메소드
④ Console API : 개발자 도구에서 콘솔 기능을 제공하는 메소드
⑤ Canvas API :
⑥ Geolocation API : 웹 브라우저에서 사용자의 현재 위치 정보 얻을 수 있는 메소드
참고 : DOM API나 Console API는 동기적 처리이고, 나머지는 비동기적으로 처리된다.
2. Callback Queue의 특징 및 종류
Callback Queue 역시 여러가지 종류의 Queue를 묶어 총칭하는 개념이다.
① Task Queue : 비동기로 처리되는 함수들의 콜백 함수가 들어가는 큐
② Microtask Queue : 우선적으로 비동기적으로 처리되는 함수들의 콜백 함수가 들어가는 큐
참고 : 일반적으로 Microtask Queue가 우선순위가 높아 먼저 처리한다.
3. AnimationFrame Queue
콜백 큐 뿐만 아니라 애니메이션 작업에 대한 처리를 담당하는 큐이다.
자바스크립트 애니메이션 동작을 제어하는 requestAnimationFrame 메소드를 통해
콜백을 등록하면, 이 큐에 적재되어 브라우저가 repaint 전에 이 큐에 있는 작업을 처리한다.
따라서 자바스크립트 스타일 관련 코드들을 AnimationFrame Queue에 비동기로 처리하도록
구성하면, 브라우저가 애니메이션의 타이밍을 관리하고 다른 탭이나 창에 있을 때는 중지시킨다.
Node.js 엔진 구동
Node.js 엔진도 브라우저와 비슷한 구조이나, 내장된 libuv 라이브러리를 사용해 비동기 I/O을 지원한다.
Node.js에서는 Web API가 아닌 Node.js API 이용해 파일 엑세스, 네트워크 엑세스, 암호화 등의 처리를 한다.
이 때 넘겨진 콜백은 libuv의 이벤트 루프를 통해 스케쥴링되고 실행된다.
참고: Node.js에서 setTimeout() 등의 타이머 API는 지원하고 있다.

① V8 (자바스크립트 엔진) : Node.js에서 사용하는 자바스크립트 엔진으로 컴파일하고 실행하는 곳
② Bindings (Node API) : Node.js 시스템과 V8 엔진과의 상호작용을 가능하게 하는 라이브러리
③ libuv 라이브러리 : Node.js에서 비동기 I/O 작업을 처리하기 위한 라이브러리
④ Event Queue : 비동기 I/O 작업 결과를 저장하고 처리하기 위한 자료구조
⑤ Event Loop : Event Queue에 저장된 I/O 작업 결과를 처리하고 다음 작업을 수행
⑥ Worker Threads : 메인 스레드와 독립적인 V8 엔진 인스턴스를 가지는 멀티 스레드
Reference
🔄 자바스크립트 이벤트 루프 동작 구조 & 원리 끝판왕자바스크립트 비동기와 이벤트 루프 브라우저의 멀티 스레드로 작업을 동시에 Javascript는 싱글 스레드 언어라고 들어본 적이 있을 것이다. '싱글' 스레드라 한 번에 하나의 작업만 수행이 가능하inpa.tistory.com
👩💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹동기/비동기 & 블로킹/논블록킹 프로그래밍에서 웹 서버 혹은 입출력(I/O)을 다루다 보면 동기/비동기 & 블로킹/논블로킹 이러한 용어들을 접해본 경험이 한번 쯤은 있을 것이다. 대부분 사람들은inpa.tistory.com
👩💻 멀티 프로세스 vs 멀티 스레드 비교 💯 완전 총정리멀티 프로세스와 멀티 스레드는 한 어플리케이션에 대한 처리방식 이라고 보면 된다. 단순히 프로그램을 여러개 띄워놓는 것이 멀티 프로세스가 아니라 이 둘은 언제 어느때에 어떤 방식으로inpa.tistory.com