IT/Study

Javascript는 왜 싱글 스레드일까?

프티 2022. 6. 1. 00:13
반응형

자바스크립트는 싱글 스레드라는 것은 개념을 외우듯이 알고 있었다.

하지만 자바스크립트 언어를 만든 브렌던 아이크 선생님은 왜 싱글 스레드를 선택했을까?

 

우선 그전에 프로세스와 스레드의 개념을 알고 가야 할 것 같다.

프로세스와 스레드

프로세스는 운영 체제로부터 할당받은 작업의 단위이다.

프로세스 내부에는 Code, Data, Stack, Heap이라는  네 가지 리소스가 존재한다.

 

프로그램을 실행했을 때 보조 기억장치(ex. 하드 디스크)에서 프로그램의 코드를 컴파일하여 주 기억장치인 메모리에 옮겨가면, 그것을 프로세스라고 한다.

스레드는 프로세스가 할당받은 자원을 사용하는 작업의 흐름 단위이다.

스레드는 Stack을 가지며 나머지 Code, Data, Heap 리소스를 사용하며 작업을 처리한다.

 

이때 프로세스 내부에 스레드가 하나라면 싱글 스레드, 여러 개라면 멀티 스레드이다.

 

멀티 스레드는 여러 스레드가 리소스를 공유하며 작업을 처리하기 때문에, 여러 작업을 동시에 처리할 수 있다.

동시에 처리한다고 말했지만, 스레드를 돌아가며 순차적으로 처리하는 방식이 매우 빠르기 때문에 거의 동시에 처리되는 것처럼 느껴진다.

어떤 스레드에서 또 다른 스레드로 넘어가는 과정을 스레드 컨텍스트 스위칭이라고 한다.

 

스레드 컨텍스트 스위칭은 스레드 하나의 작업을 진행하기 위해 해당 스레드의 Context를 읽어오고, 다시 다른 스레드로 작업을 변경할 때, 이전 스레드의 Context를 저장하고 작업을 진행할 스레드의 Context를 읽어오는 작업을 말한다.
여기서 Context는 정보를 나타내는데 레지스터, 커널 스택, 사용자 스택 등의 여러 정보를 말하지만, 이에 대해서는 아직 잘 모르기에 추후에 다루도록 하겠다.

 

만약 스레드 컨텍스트 스위칭의 시간이 오래 걸리는 경우, 프로그램의 성능 저하가 일어나 프로그램이 멈추는 사용자 경험을 할 수 있다.

 

또한 멀티 스레드는 동시성에 대응해야 한다는 어려움이 있다.

동시성이란, 싱글 코어에서 멀티 스레드를 동작시켜 동시에 실행되는 것 같이 보이는 것이다.

동시성은 병렬성과 비교해서 보아야 한다.

 

동시성은 싱글 코어에서 멀티 스레드 환경을 구성하여 스레드 컨텍스트 스위칭을 통해 여러 개의 스레드가 번갈아가면서 실행되는 성질이다.

 

반면 병렬성은 멀티 코어에서 멀티 스레드를 동작시키는 방식이다. 따라서 실제로 동시에 여러 작업이 처리된다고 볼 수 있다.

 

위에서 이야기했듯이, 멀티 스레드는 여러 개의 스레드가 프로세스가 할당받은 리소스들을 공유하며 작업을 처리하기 때문에, 같은 자원을 두고 교착상태(deadlock)가 발생할 수 있다. 따라서 교착상태를 해결하기 위해 스레드 안정성(thread safe)을 가지며 코드를 작성해야 한다. 스레드 안정성을 확보하기 위한 방법들은 추후에 자세히 다루도록 하고, 방법들만 간단하게 나열해보겠다.

  • 암시적 Lock (synchronuized)
  • 명시적 Lock
  • thread safe 한 객체 사용
  • 불변 객체 사용

자바스크립트는 왜 싱글 스레드일까?

자바스크립트가 싱글 스레드를 선택한 이유는 자바스크립트가 탄생한 역사를 보면 알 수 있다.

  • 자바스크립트는 웹 페이지의 보조적인 기능을 수행하기 위해 브라우저에서 동작하는 경량 프로그래밍 언어를 도입하기로 결정하고 만들어진 언어이다.
  • 웹 사이트를 구현하던 개발자들에게 자바라는 언어는 다소 무겁고 어려운 언어였다.
  • 자바는 멀티 스레드 모델을 지원하는 언어이다.
  • 멀티 스레드로 구현되는 서비스에서는 동시성 문제를 불가피하게 신경 써야만 한다.

이러한 역사 그리고 동시성으로 인한 복잡도 증가와 같은 이유들로 인해 자바스크립트는 싱글 스레드로 탄생한 것이다!

 

그럼에도 우리는 자바스크립트를 멀티 스레드처럼 사용하고 있다. 이것이 어떻게 가능하게 되었을까?

비동기 vs 동기

자바스크립트는 싱글 스레드 방식으로 실행된다.

따라서 하나의 실행 컨텍스트 스택을 갖는다. 하나의 스레드로는 동시에 2개 이상의 함수를 실행시킬 수 없다.

따라서 동기적인 처리 방식을 사용한다.

 

하지만 Web api, Eventloop, Taskque와 같은 자바스크립트가 아닌 브라우저에 내장되어 있는 기능들을 사용함으로써, 자바스크립트는 비동기 처리를 할 수 있다.

따라서 우리는 DOM Element의 이벤트 핸들러, 타이머, 서버에 자원을 요청 또는 응답할 수 있는 것이다.

 

브라우저의 구조 및 자세한 과정은 추후에 다루도록 하겠다.

 

정리하자면 다음과 같다.

  • 자바스크립트 언어의 초기 개발 목적은 웹 페이지의 보조적인 기능을 수행하기 위한 경량적 언어였다.
  • 따라서 자바스크립트는 멀티 스레드의 동시성과 같은 무겁고 대응하기 복잡한 부분들을 피하기 위해 싱글 스레드 방식으로 구현되었다.
  • 하지만 브라우저의 내장 기능들(Web api, Eventloop, Taskque)을 활용하여 비동기 처리가 가능하게 함으로써 멀티 스레드처럼 동작시킬 수 있다.

 

참고

https://miracleground.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%99%9C-%EC%8B%B1%EA%B8%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EB%A5%BC-%EC%84%A0%ED%83%9D%ED%96%88%EC%9D%84%EA%B9%8C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%8F%99%EA%B8%B0-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%94%EC%A7%84-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%A3%A8%ED%94%84

 

자바스크립트는 왜 싱글 스레드를 선택했을까? 프로세스, 스레드, 비동기, 동기, 자바스크립트

목차 프로세스와 스레드 프로세스 싱글 스레드와 멀티 스레드 자바스크립트는 왜 싱글 스레드를 선택했을까 동기 vs 비동기 동기 비동기 자바스크립트로 비동기 처리하는 방법 자바스크립트 엔

miracleground.tistory.com

https://hojak99.tistory.com/307

 

[Thread] 스레드 컨텍스트 스위칭

스레드 컨텍스트 스위칭이란 무엇일까? 우선 우리는 컨텍스트 스위칭이란 것부터 알아야 한다. 그래야 스레드에서의 컨텍스트 스위칭을 더 쉽게 이해할 수 있을 것 같은 내 생각 때문이다. 이

hojak99.tistory.com

https://velog.io/@dyllis/%EB%8F%99%EC%8B%9C%EC%84%B1%EC%9D%B4-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

 

동시성이 무엇일까

소개 이 글을 작성하게 된 이유는 사전면접이나 기술면접에서 항상 등장하는 프로세스와 스레드 차이, 동시성에 대해서 설명해주세요라고 했을 때 제대로 설명하지 못하는 나의 모습을 보고 정

velog.io

https://ganzicoder.tistory.com/98

 

스레드와 동시성

스레드 스레드는 어떠한 프로그램 안에서 , 프로세스 안에서 실행되는 흐름의 단위! 통상 한 프로그램은 하나의 스레드를 갖고있지만 프로그램 환경에따라 둘 이상의 스레드를 동시에 실행가능

ganzicoder.tistory.com

https://velog.io/@mooh2jj/%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%9D%B4%EC%8A%88

 

멀티 스레드의 동시성 이슈 그리고 해결방법

스레드는 작업의 한단위이다. 여기서 멀티스레드 방식은 멀티태스킹을 하는 방식 중, 한 코어에서 여러 스레드를 이용해서 작업을 처리하는 방식이다.멀티 스레드를 이용하면 공유하는 장원이

velog.io

 

반응형

'IT > Study' 카테고리의 다른 글

Status Code  (0) 2022.05.31
Firebase Authentication (with Google)  (0) 2022.05.30
Blocking/NonBlocking과 Sync/Async  (0) 2022.05.29
Cross Browsing  (0) 2022.05.24
Renderer Process  (0) 2022.05.21