JavaScript가 왜 단일 스레드인가?

작성자

JavaScript가 단일 스레드인 이유

JavaScript는 단일 스레드 형식을 사용하는 주된 이유는 단순성과 예측 가능성 때문입니다.
학습목표
1.
JavaScript가 무엇인지 알 수 있음
2.
단일 스레드와 다중 스레드의 정의와 비교가능함.
3.
JavaScript의 언어적 측면에서 단일 스레드인 이유를 알 수 있음.
4.
Node.js측면서 단일 스레드인 이유를 알 수 있음

학습 전 필수 필요개념 복습

1. 스레드와 프로세스: 프로세스와 스레드의 차이점

프로세스
현재 실행되고 있는 프로그램
독립성: 각 프로세스는 독립적인 메모리 공간을 가지며, 다른 프로세스와 메모리를 공유하지 않습니다.
보안성: 프로세스 간의 메모리 접근이 불가능하여 보안이 강화됩니다.
자원 할당: 운영 체제는 프로세스에게 CPU 시간, 메모리, 파일 핸들 등의 자원을 할당합니다.
스레드
프로세스 내에서 실행되는 작은 실행 단위.
여러 스레드가 하나의 프로세스를 구성할 수 있음.
스레드는 같은 프로세스 내에서 자원을 공유

프로세스와 스레드의 주요 차이점

항목
프로세스
스레드
메모리 공간
독립적
공유
생성 비용
높음
낮음
안정성
높은 보안성
낮은 보안성
병렬성
멀티 프로세싱
멀티 스레딩

2. JavaScript 엔진

JavaScript의 실행 방식
JavaScript 엔진: JavaScript 코드를 해석하고 실행하는 엔진.
실행 컨텍스트: 코드가 실행되는 환경을 의미. 함수 호출 시마다 새로운 컨텍스트 생성.
콜 스택: 실행할 코드들이 쌓이는 구조. 현재 실행 중인 작업의 상태를 저장.

3. 비동기 프로그래밍

작업이 순차적으로 실행되지 않고, 각 작업이 완료될 때까지 기다리지 않고 다음 작업을 실행하는 프로그래밍 방식
비동기 프로그래밍의 종류
1.
콜백 함수: 특정 이벤트나 작업이 완료된 후 호출되는 함수.
2.
프로미스: 비동기 작업의 완료 또는 실패를 나타내는 객체.
3.
async/await: 프로미스를 기반으로 비동기 코드를 동기식 코드처럼 작성할 수 있게 해주는 문법.

4. 이벤트 루프

JavaScript의 비동기 작업을 처리하는 메커니즘 , Node.js의 핵심
호출 스택이 비어 있을 때 대기 중인 작업을 콜백 큐에서 가져와 실행
콜백 큐(Callback Queue): 비동기 작업이 완료된 후 실행될 콜백 함수들이 대기하는 큐입니다.
작동 방식
1.
탐색 단계: 이벤트 큐에 들어온 이벤트를 확인한다.
2.
실행 단계: 콜백 함수를 실행한다.
3.
대기 단계: 새로운 이벤트를 대기한다.

단일 스레드란..

단일 스레드 (Single-thread)

하나의 실행 흐름을 가지는 것을 의미함.
즉, 한 번에 하나의 작업만을 처리할 수 있는 스레드임.
대부분의 프로그래밍 언어에서는 메인 스레드가 단일 스레드로 이루어져 있고,
이 스레드는 코드를 순차적으로 실행하며, 한 번에 하나의 명령어만 처리
주로 웹 개발에서 사용되는 JavaScript가 단일 스레드 언어의 대표적인 예입니다
JavaScript는 이벤트 루프와 비동기 처리를 통해 단일 스레드에서 여러 작업을 관리하고 비동기적으로 처리할 수 있습니다.

특징:

단순성: 하나의 스레드만을 관리하기 때문에 스레드 간 동기화 문제나 경쟁 상태가 발생하지 않습니다.
예측 가능성: 코드 실행 순서가 명확하고 예측 가능합니다.
성능 제한: CPU 집중적인 작업에서는 성능 저하가 발생할 수 있습니다.

다중 스레드(Multi-threading)

하나의 프로세스 내에서 여러 개의 스레드를 생성하여 병렬로 작업을 수행하는 기법
각 스레드는 프로세스의 메모리 공간을 공유
독립적으로 실행됩니다.
이는 CPU의 활용도를 극대화하고, 프로그램의 성능을 향상시키기 위한 중요한 기술입니다.

다중 스레드의 작동 원리

스레드 생성: 프로세스 내에서 여러 스레드를 생성합니다.
작업 분할: 각 스레드에 할당된 작업을 병렬로 실행합니다.
동기화: 여러 스레드가 동일한 자원을 사용할 때 발생할 수 있는 충돌을 방지하기 위해 동기화 메커니즘을 사용합니다.
종료: 모든 스레드가 작업을 완료하면 스레드를 종료합니다.

다중 스레드와 싱글 스레드 비교

항목
싱글 스레드
다중 스레드
작업 처리
순차적으로 작업 처리
병렬로 작업 처리
CPU 활용도
낮음
높음
응답성
낮음
높음
코드 복잡성
낮음
높음

JavaScript가 단일 스레드인 이유 : 언어적 측면

웹의 특성
JavaScript는 웹 브라우저에서 사용자 인터페이스를 조작하기 위해 설계됨.
단일 스레드로 동작함으로써 복잡한 동기화 문제를 피함.
UI의 일관성을 유지할 수 있음.
비동기 작업 처리
이벤트 루프와 콜백 큐를 통해 비동기 작업을 효율적으로 처리함.
콜백 큐에 쌓인 작업들은 이벤트 루프에 의해 콜 스택이 비어 있을 때 처리됨.
간결성
단일 스레드는 멀티 스레드 환경에서 발생할 수 있는 상태 관리와 동기화 문제를 단순화함.

결론

2. JavaScript가 단일 스레드인 이유 : Node.js 측면

Node.js란 무엇인가?

정의: Node.js는 자바스크립트를 서버 사이드에서 실행하기 위해 개발된 런타임 환경.
사용이유 : 웹브라우저 환경이 아닌
특징:
비동기 이벤트 기반의 I/O 처리하여 메인 스레드가 블로킹 되지 않음.
싱글 스레드에서 동작하지만, 내부적으로 스레드 풀을 사용하여 효율적 I/O 처리 가능
빠르고 확장 가능한 네트워크 애플리케이션 개발에 적합함.

결론

Node.js 역시 JavaScript를 기반으로 한 서버 사이드 런타임 환경이며, 이 역시 단일 스레드에서 동작하지만 비동기 이벤트 기반의 입출력 처리를 통해 멀티 스레드 환경과 비슷한 효과를 얻을 수 있음.
서버 사이드 런타임 환경
웹 서버에서 실행되는 코드를 처리하는 환경