javaScript가 단일 스레드인 이유

작성자

공부를 시작한 이유

4학년 1학기 과정 중 기업 연계 프로젝트를 미리 준비하기 위해서 REACT를 공부해야할 필요성을 느껴 방학중에 공부를 진행하던 중 일단은 javaScript를 알아놓으면 이해하기 더 좋을거같은 생각이 들어서 공부를 시작하게 되었다.

JavaScript에 대한 소개

JavaScript는 웹 개발에서 가장 널리 사용되는 프로그래밍 언어 중 하나입니다. 이 언어는 웹 페이지를 동적으로 만들고 상호작용할 수 있게 해주는 핵심 요소입니다. 다음은 JavaScript에 대한 간략한 소개와 주요 특징들을 설명합니다.

JavaScript란?

JavaScript는 웹 브라우저에서 실행되는 스크립트 언어로, 초기에는 간단한 동적 기능을 처리하기 위해 개발되었습니다. 현재는 클라이언트-사이드 뿐만 아니라 서버-사이드에서도 널리 사용되며, 다양한 플랫폼에서 활용될 수 있습니다.

JavaScript의 주요 특징

1.
동적 웹 페이지 구현: JavaScript는 HTML과 CSS와 함께 사용되어 웹 페이지를 동적으로 만들고 사용자와 상호작용할 수 있게 합니다.
2.
객체 기반 프로그래밍: JavaScript는 객체 지향 언어로, 다양한 객체와 메서드를 사용하여 프로그램을 구성할 수 있습니다.
3.
이벤트 기반 프로그래밍: 이벤트 처리를 위해 JavaScript는 콜백 함수와 이벤트 리스너를 사용하여 사용자 입력에 반응하고, 웹 페이지의 상태 변화를 감지할 수 있습니다.
4.
크로스 플랫폼 지원: 모든 주요 웹 브라우저에서 JavaScript를 지원하며, 최근에는 Node.js와 같은 서버 측 플랫폼을 통해 다양한 환경에서 실행될 수 있습니다.

JavaScript의 활용 예

웹 개발: 웹 페이지의 동적 요소 구현, 데이터 처리 및 유효성 검사 등
웹 애플리케이션 개발: JavaScript 프레임워크와 라이브러리를 사용하여 단일 페이지 애플리케이션(SPA) 구축
게임 개발: HTML5 Canvas와 WebGL을 이용한 브라우저 기반 게임 개발
모바일 애플리케이션 개발: React Native, Ionic 등의 프레임워크를 통한 모바일 앱 개발

JavaScript가 싱글 스레드인 이유

스레드란?

프로세서 내부에서 일을 하는 주체를 의미한다.
싱글 스레드
멀티 스레드

싱글 스레드

하나의 스레드를 가지고 있는 것을 의미하며, 한번에 하나의 동작만이 가능하다.

멀티 스레드

여러개의 스레드로 한번에 여러 동작을 하는게 가능하다.

싱글 스레드의 특징

문맥 교환(context switch)작업을 요구하지 않는다.

문맥 교환이란 이전의 프로세스 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 의미한다.

자원 접근에 대한 동기화를 신경쓰지 않아도 된다.

멀티 스레드의 경우 스레드들이 동시에 동일한 자원에 접근하는 것을 막아주어야 하는데 싱글 스레드의 경우 이에 대한 부분은 신경 쓰지 않아도 괜찮다.

멀티 스레드의 특징

에러의 발생시 싱글 스레드는 처리하지 못하는 경우 멈추지만 멀티 스레드는 새로운 스레드를 생성하는 것으로 극복하는 것이 가능하다.

JavaScript가 싱글 스레드인 이유

1. 초기 설계 의도

JavaScript가 초기에 개발될 때, 웹 브라우저 환경에서 동적인 요소를 처리하고 사용자와의 상호작용을 담당하기 위해 설계되었습니다. 이는 단일 스레드 모델을 따라야 했기 때문에 JavaScript 엔진은 단일 호출 스택(call stack)과 단일 메모리 힙(memory heap)을 사용하여 실행됩니다.
단일 호출 스택
실행 콘텍스트를 관리하는 스택 데이터 구조
단일 메모리 힙
프로그램이 실행되는 동안 동적으로 할당되는 메모리 영역

2. 동시성 제어

싱글 스레드 모델은 동시성(concurrency) 문제를 간단하게 해결할 수 있습니다. 여러 개의 스레드가 동시에 데이터에 접근하려고 할 때 발생할 수 있는 경쟁 상태(race condition)를 방지하기 위해, JavaScript는 이벤트 루프(event loop)와 큐(queue)를 사용하여 순차적으로 작업을 처리합니다. 이는 코드를 단순하게 유지하고 예측 가능한 실행 순서를 보장합니다.

3. 웹 브라우저와의 통합

JavaScript는 웹 페이지의 동적인 부분을 담당하는 주요 언어로서, 웹 브라우저의 기능과 밀접하게 통합되어 있습니다. 웹 브라우저는 여러 가지 탭과 창을 동시에 관리해야 하지만, 각 탭에서 실행되는 JavaScript 코드는 싱글 스레드에서 동작하여 자원 관리를 단순화합니다.

싱글 스레드이면서 비동기 방식인 이유

javaScript엔진(v8)이 싱글 스레드로 동작하고 런타임 환경(브라우저)이 멀티 스레드를 제공한다.
싱글 스레드를 사용하는 이유는 이벤트 루프를 통한 비동기 처리 메커니즘을 통해 효율적이고 예측 가능한 동작을 가능하게 하기 위함입니다.

javaScript의 런타임 모델

스택

함수의 호출이 스택의 frame 스택을 생성

객체는 힙에 할당

처리할 메시지의 대기열을 생성
→ 이벤트 루프의 임의 시점에, 런타임은 대기열에서 가장 오래된 메시지부터 큐에서 꺼내 처리
→ 메시지가 존재하지 않으면 새로운 메시지가 도착할때 까지 동기적으로 대기