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