본문 바로가기
프론트엔드/[언어] 자바스크립트

Single Thread

by 도툐리 2024. 2. 27.

0. 스레드란?

https://dotyori.tistory.com/106

 

프로세스와 스레드

0. Thread가 뭘까? (1) 프로세스 실행 중인 프로그램의 인스턴스. 운영 체제에서는 프로세스를 시스템의 기본 실행 단위로 취급함. 각 프로세스는 독립적인 메모리 주소 공간을 가지며, 다른 프로세

dotyori.tistory.com

  • 예를 들어, 브라우저를 프로세스라고 생각하면 블로그 글 작성하는 스레드1, 유튜브 영상 틀어놓기 스레드2
  • 프로세스 - 프로그램의 작업 단위, 스레드 - 프로세스의 실행단위

 

1. 자바스크립트는 싱글 스레드 언어

자바스크립트는 기본적으로 싱글 스레드 언어입니다. 이는 자바스크립트 엔진이 한 번에 하나의 작업만 수행할 수 있음을 의미합니다. 여기서 '스레드'란 프로그램이나 프로세스 내에서 실행되는 실행의 흐름 단위를 말합니다. 싱글 스레드 환경에서는 이러한 실행 흐름이 단 하나만 존재하기 때문에, 동시에 여러 작업을 처리할 수 없습니다.

 

자바스크립트는 싱글 스레드 런타임을 가집니다. 따라서 하나의 자바스크립트 런타임은 스택 하나를 가지고 스택에 저장되어 있는 일들을 스택 맨 위부터 한 번에 하나씩만 처리할 수 있습니다. 

 

2. 싱글 스레드의 특징과 작동 방식

  1. 한 번에 하나의 일만 수행
    👉🏻 one thread == one call stack == one thing at a time

    문맥 교환(context switching)이 필요하지 않습니다. (멀티 스레드는 context switching으로 번갈아가며 작업 수행)
  2. 순차적 실행
    자바스크립트에서 코드는 위에서 아래로, 한 줄씩 순차적으로 실행됩니다. 하나의 작업이 완료되어야 다음 작업으로 넘어갈 수 있습니다.
  3. 블로킹(Blocking)
    싱글 스레드 환경에서는 긴 실행 시간을 필요로 하는 작업(예: 네트워크 요청, 대규모 데이터 처리)이 콜 스택을 차지하게 되면, 이후의 모든 작업이 대기 상태로 들어가게 됩니다. 이를 '블로킹' 현상이라고 합니다.
  4. 프로그래밍 난이도가 쉽고 CPU 및 메모리를 적게 사용

 

싱글 스레드는 직렬을 형태로 하나의 스레드가 하나의 작업만 수행하여 순서대로 처리하는 모습을 볼 수 있습니다.

멀티 스레드는 병렬로 일을 처리하며 여러가지 스레드를 한꺼번에 처리합니다.

 

3. 싱글 스레드의 장단점

  • 장점: 구현의 단순성과 예측 가능성. 싱글 스레드 모델에서는 동시에 여러 작업이 실행되는 것에 대한 걱정 없이 코드를 작성할 수 있습니다. 이는 디버깅과 오류 추적을 상대적으로 쉽게 만듭니다.
  • 단점: 블로킹 문제와 성능 제한. 한 번에 하나의 작업만 처리할 수 있기 때문에, 장시간 실행되는 작업은 애플리케이션의 반응성을 저하시킬 수 있습니다.

-> 자바스크립트의 이러한 싱글 스레드 특성은 웹 애플리케이션의 비동기 이벤트 처리에 큰 영향을 미치며, 이를 해결하기 위한 다양한 기술(예: 콜백 함수, 프로미스, async/await)이 개발되었습니다.

 

4. 자바스크립트는 왜 싱글 스레드 언어로 만들어졌을까?

자바스크립트가 싱글 스레드 언어로 설계된 주요 이유는 단순성동기화 문제를 피하기 위해서입니다. 자바스크립트가 처음 개발될 때, 그 주된 목적은 웹 페이지의 동적 행동을 개선하는 것이었습니다. 이런 환경에서 멀티스레딩이 가져올 수 있는 복잡성과 가능한 동기화 문제(예: 데이터 경쟁, 데드락)를 방지하기 위해 싱글 스레드 모델이 선택되었습니다.

 

싱글 스레드 모델을 사용함으로써, 자바스크립트는 한 번에 하나의 작업만 처리할 수 있습니다. 이는 코드 실행이 예측 가능하며, 개발자가 멀티스레드 환경에서 흔히 발생하는 복잡한 동기화 이슈를 신경 쓰지 않아도 된다는 의미입니다. 하나의 작업이 완료되기 전까지는 다음 작업이 시작되지 않으므로, 상태 관리와 디버깅이 더 단순하고 직관적입니다.

 

그러나 싱글 스레드 모델은 동시에 여러 작업을 처리하는 데 한계가 있습니다. 이를 해결하기 위해, 자바스크립트는 비동기 콜백, 프로미스(Promises), async/await와 같은 비동기 프로그래밍 패턴을 도입하여 I/O 작업이나 시간이 오래 걸리는 작업을 효율적으로 처리할 수 있게 되었습니다. 이는 자바스크립트 엔진이 백그라운드에서 비동기 작업을 처리할 수 있게 하며, 완료되면 콜백 함수나 프로미스 해결을 통해 메인 스레드로 결과를 전달합니다.

 

이러한 비동기 처리 모델 덕분에, 자바스크립트는 웹 개발의 복잡성이 증가하는 현대의 요구 사항에도 불구하고 싱글 스레드 언어로서의 단순성을 유지하면서 효율적으로 동작할 수 있습니다.

 

5. 자바스크립트가 싱글스레드 언어임에도 불구하고 동시성을 가질 수 있는 이유

동시성을 보장하는 비동기, 논블로킹 작업들은 javascript 엔진을 구동하는 런타임(Runtime) 환경에서 담당합니다.

여기서의 런타임 환경이란, 브라우저 혹은 Node.js를 의미합니다.

 

Node.js에서의 논블로킹 모델은 Input과 Output이 관련된 작업(http, Database CRUD, third party api, filesystem), 오랫동안 CPU를 사용해야하는 작업 등의 블로킹 작업들을 백그라운드에서 수행하고, 이를 비동기 콜백함수로 이벤트 루프에 전달합니다. 여기서 백그라운드란 OS 커널 혹은 libuv의 스레드 풀을 의미하는데요, libuv는 OS 커널에서 어떤 비동기 작업들을 지원해주는지 알고 있기때문에, 작업 종류에 따라 커널 혹은 스레드 풀로 분기합니다. 작업이 완료되면 이벤트 루프에게 이를 알려주고, 이벤트 루프에 콜백함수로 등록됩니다.

동시성의 의미

사실 동시성의 의미가 정말로 javascript 코드가 동시에 실행되는걸 의미하는 건 아닙니다.
어차피 비동기 작업의 끝은 Event Loop를 통해 결국엔 javascript 엔진의 단일 Call Stack으로 오게 되어있습니다.
앞에서 말했듯 javascript는 결국엔 싱글 스레드 언어이고, 이 핵심(single thread → single call stack → single thing at a time)은 변하지 않습니다.

참고자료

더 자세한 내용은 아래서 확인해주세요.

 

https://dotyori.tistory.com/105

 

Event Loop

0. 누군가 Event Loop에 대해 설명해주세요, 라고 한다면? 이벤트 루프(Event Loop)는 자바스크립트의 비동기 동작을 가능하게 하는 런타임 메커니즘입니다. 자바스크립트는 기본적으로 단일 스레드

dotyori.tistory.com

https://wslog.dev/js-event-loop

 

자바스크립트는 어떻게 동시성을 지원할까?

Javascript 동시성의 핵심에 있는 Event-Loop

wslog.dev

 

댓글