JavaScript는 왜 싱글스레드인가?

상태
시작 전
담당자
날짜
2024/06/26
숫자
0

목차

1.
JavaScript의 싱글 스레드 설계 배경
2.
프로세스(Process)란?
2-1. 스레드(Thread)란?
2-2. 스레드(Thread)와 프로세스(Process)의 차이점
3.
싱글스레드(Single Thread)란?
3-1. 싱글스레드의 장단점
4.
JavaScript가 그래서 뭘까?
5.
예상 질문과 답변
6.
요약 및 결론

1. JavaScript의 싱글 스레드 설계 배경

일단 JavaScript가 왜 싱글 스레드인지를 이해하기 위해, 프로세스와 스레드를 먼저 이해하고, 웹 브라우저의 환경과 JavaScript의 설계 목적에 대해 알아야 합니다.

2. 프로세스(Process)란?

프로세스(Process)는 운영 체제에서 실행 중인 프로그램을 의미합니다.
프로세스는 실행 중인 프로그램의 인스턴스이며, 각 프로세스는 독립된 메모리 공간과 시스템 자원을 할당받는 것에 대해서 이야기합니다. 각 프로세스는 자체 주소 공간을 가지고 있으며, 다른 프로세스와 메모리를 직접 공유하지 않는다는 특성을 가지고 있습니다.
예시로, 웹 브라우저와 워드 프로세서 프로그램은 서로 다른 프로그램을 실행할 땐, 각각 독립된 프로세스로 실행되어서, 독립적인 메모리 공간과 시스템 리소스를 사용한다는 것을 이야기할 수 있습니다.

2-1. 스레드(Thread)란?

스레드(Thread)는 프로세스 내에서 독립적으로 실행되는 가장 작은 실행 단위입니다.
스레드는 동일한 프로세스 내에서 메모리 공간과 자원을 공유하며, 동시에 여러 작업을 수행할 수 있게 합니다. 여기서 스레드(Thread)는 하나의 프로세스 내에서 병렬 작업을 가능하게 하며, 같은 프로세스 내에서 여러 작업을 동시에 수행할 수 있습니다.
예시로, 웹 브라우저의 각 탭은 동일한 프로세스 내에서 별도의 스레드로 실행될 수 있음을 이야기할 수 있습니다.

2-2. 스레드(Thread)와 프로세스(Process)의 차이점

뭐가 다를까?
메모리 사용: 프로세스는 독립된 메모리 공간을 가지지만, 스레드는 같은 프로세스 내에서 메모리를 공유합니다. 즉, 여러 스레드가 같은 데이터에 접근할 수 있다는 것이 차이점입니다.
자원 할당: 프로세스는 독립적인 자원을 가지고, 프로세스 간의 통신은 상호 프로세스 통신(IPC)을 통해 이루어집니다. 스레드는 같은 프로세스 내에서 자원을 공유하기 때문에 더 빠르고 효율적인 통신이 가능합니다.
오버헤드: 새로운 프로세스를 생성하는 것은 스레드를 생성하는 것보다 더 많은 오버헤드(시스템 자원 소비)를 요구합니다. 따라서 스레드를 사용하는 것이 더 경량화된 병렬 처리를 가능하게 합니다.

3. 싱글스레드(Single-Thread)란?

싱글 스레드(Single-thread)는 하나의 실행 경로를 갖는 스레드를 말합니다.
스레드는 프로그램 내에서 독립적으로 실행될 수 있는 가장 작은 실행 단위로, CPU에서 처리되는 작업의 단위입니다. 여러 스레드가 동시에 실행될 수 있는 멀티 스레드와는 달리, 싱글 스레드는 한 번에 하나의 작업만 처리할 수 있습니다.
예를 들어보자, 웹 브라우저의 메인 스레드는 일반적으로 싱글 스레드입니다. 이 스레드는 HTML 문서를 해석하고, CSS 스타일을 적용하며, JavaScript 코드를 실행하는 등의 작업을 순차적으로 처리합니다. 만약 메인 스레드에서 어떤 작업이 길어지면, 다음 작업들은 기다려야 하므로 UI 응답이 지연될 수 있습니다.

3-1. 싱글스레드의 장단점

싱글 스레드 모델은 동시성 관리가 단순해지고, 예측 가능한 실행 순서를 유지할 수 있는 장점이 있지만, CPU 집약적인 작업이나 긴 실행 시간을 요구하는 작업을 처리할 때는 성능 저하가 발생할 수 있습니다. 이런 경우에는 별도의 스레드를 이용해야 하거나 비동기적인 방식을 활용하여 작업을 분산시키는 등의 기술적인 접근이 필요할 수 있습니다.

4. JavaScript가 그래서 뭘까?

JavaScript는 웹 페이지의 동적 콘텐츠를 만들기 위해 브라우저에서 주로 사용되는 프로그래밍 언어이다.
웹페이지를 만들때, 사용되는 언어 중 HTML, CSS는 단순히 글을 작성하고 사진을 넣고, 꾸미는 작업정도만 가능할 뿐이지 지금 현재 우리가 볼 수 있는 웹사이트 페이지들의 기능들은 JavaScript를 사용한 것이라고 생각하면 됩니다.
주요 특징
동적 언어: JavaScript는 동적 타입을 가지며, 런타임에 타입이 결정됩니다.
객체 지향: 프로토타입 기반 객체 지향 언어로, 클래스가 아닌 프로토타입을 통해 객체 지향 프로그래밍을 지원합니다.
함수형 프로그래밍: 함수가 일급 객체로 취급되며, 고차 함수와 같은 함수형 프로그래밍 기법을 지원합니다.
비동기 프로그래밍: 콜백, 프로미스, async/await 등을 통해 비동기 프로그래밍을 지원합니다.
사용 사례
클라이언트 사이드 개발: 브라우저에서 실행되어 사용자 인터페이스를 동적으로 업데이트하거나, 폼 검증, 애니메이션, 이벤트 처리 등을 수행합니다.
서버 사이드 개발: Node.js를 통해 서버 측에서도 사용되며, 웹 서버 구축, API 개발, 데이터베이스 작업 등을 수행합니다.
모바일 앱 개발: React Native, Ionic 등의 프레임워크를 사용하여 모바일 애플리케이션 개발에도 활용됩니다.

5. 예상 질문과 답변

JavaScript가 싱글 스레드인 경우에 어떤 장점이 있나요?
단순한 동기화: 하나의 스레드로만 동작하기 때문에 다중 스레드로 인한 동기화 문제를 해결할 필요가 없습니다.
예측 가능한 실행 순서: 이벤트 루프를 통해 비동기 작업을 처리하여 실행 순서를 예측할 수 있습니다.
웹 브라우저 안정성: 단일 스레드로 실행되는 경우 예기치 않은 상황이 줄어들어 브라우저의 안정성이 증가합니다.
싱글 스레드 모델은 JavaScript의 성능에 어떤 영향을 미치나요?
CPU 집약적 작업 처리 어려움: CPU를 많이 사용하는 작업이 메인 스레드에서 실행될 경우, 다른 작업들의 응답 시간이 지연될 수 있습니다.
블로킹 작업 문제: 메인 스레드에서 실행 중인 긴 작업이 있으면 UI 응답이 느려질 수 있습니다.
단일 스레드 제한: 여러 작업을 동시에 처리하기 위해서는 추가적인 비동기 처리나 워커 스레드 등의 기술이 필요합니다.
JavaScript가 싱글 스레드인 경우에도 병렬 처리를 할 수 있는 방법은 무엇이 있나요?
비동기적인 방식으로 여러 작업을 동시에 처리할 수 있도록 Promise, Async/Await 등의 기능을 활용할 수 있습니다.
클라이언트-서버 모델에서는 Node.js와 같은 서버 사이드 JavaScript 환경을 이용하여 다중 프로세스를 생성하여 병렬 처리를 구현할 수도 있습니다.

6. 요약 및 결론

이번 방학 중 웹개발에 대해서 배우게 되었는데, JavaScript에 대해서 공부하게 되면서 JavaScript가 싱글 스레드인 이유에 대해서 공부하게 되었다, 싱글 스레드인 이유는 자바스크립트가 주로 웹 브라우저에서 사용되며, 사용자 인터페이스의 일관성과 응답성을 유지하기 위해서라는 이유에 대해서 알 수 있었다.
싱글 스레드로 동작하면 코드가 순차적으로 실행되므로 예측 가능한 실행 순서를 유지할 수 있으며, 동시성 문제(예: 레이스 컨디션)를 피할 수 있어 개발이 간단해지고, 복잡한 동기화 작업이 필요 없다.