스레드란?🤔
스레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미합니다.
하나의 프로세스 안에서 다양한 작업을 담당하는 최소 실행 단위를 스레드라고 합니다.
예.) 사파리(프로세스) 에서 유튜브로 음악 들으며(스레드1) 인터넷 검색하기(스레드2)
싱글 스레드
하나의 프로세스가 한번에 하나의 일만 처리하는 것
동기화 신경 x
멀티 스레드
하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것
예.) 멀티 스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에서 사용자와 상호작용 가능
하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받기에 주의 깊은 설계가 필요하다.
또한 스레드 간의 자원 공유로 동시성 문제가 발생한다. 여기서 말하는 동시성 문제는 여러 개의 쓰레드가 같은 데이터에 접근하는 경우, 경우에 따라 동시성 문제가 발생할 수 있다.
자바스크립트는 왜 싱글 스레드를 선택했을까❓
우선 자바스크립트란 웹페이지의 보조적인 기능을 수행하기 위해 브라우저에서 동작하는 경량 프로그래밍 언어를 도입하기로 결정하고 만들어진 언어이다. 좀더 간단하게 말하면 무겁고 어려운 언어인 java 대신 나온것이다.
그럼 무겁고 어렵다라는 것은 무슨 뜻일까? 🤔
참고로 멀티 스레드 모델은 프로그래밍 난이도가 높다.즉 위에서 말하는 무겁고 어렵다는 것은 멀티 스레드 모델을 갖춘 프로그래밍을 뜻하는 것이다.
멀티 스레드로 구현된 서비스에서는 이 동시성 문제에 대해 많이 신경쓴다고 한다. 자바스크립트는 멀티 스레드 환경에서 발생할 수 있는 복잡한 시나리오를 신경쓸 필요가 없다.
그럼 결국 자바스크립트는 멀티스레드가 아닌 싱글스레드에서 동시성을 어떻게 처리할수 있을까...?
동기
자바스크립트 엔진은 싱글 쓰레드 방식으로 실행되기 때문에 하나의 실행 컨텍스트 스택을 갖는다. 이는 함수를 실행할 수 있는 곳이 단 하나이며, 다른뜻으로는 2개 이상의 함수를 동시에 실행시킬 수 없다는 것이다.
결국 말하자 하는 것은 처리에 시간이 걸리는 태스크를 실행하는 경우 블로킹이 발생한다는 것을 말한다. 블로킹을 간당히 예로 들자면 아래와 같다.
예.) 우리가 휴게소에서 음식을 사 먹기 위해 줄을 섰다. 앞 손님이 음식을 주문하고, 주문한 음식을 받을때 까지 줄에 서있는 현상을 블로킹 이라 한다. 동기적인 작업에 따라 이후 작업이 막히는 것을 뜻한다. 이와 반대로 작업이 막히지 않는 것을 non-blocking 이라 한다.
비동기
현재 실행중인 태스크가 종료되지 않은 상태라 해도 다음 태스크를 곧바로 실행하는 방식을 비동기 처리라고 한다.
여러개의 작업들을 동시에 처리할 수 있다. 허나 작업의 실행 순서가 보장되지 않는 단점이 있다.
비동기 처리를 수행하는 비동기 함수는 전통적으로 콜백 패턴을 사용
자바스크립트 비동기 처리 방식
자바스크립트는 싱글 쓰레드로 동작하는 것
싱글스레드 방식은 한 번에 하나의 작업만 처리할 수 있다는 것을 의미. 하지만 브라우저가 동작하는 것을 보면 많은 작업들이 동시에 처리되는 것처럼 느낀다. 그러한 이유는 자바스크립트는 동시성을 지원하는 이벤트 루프가 존재하기 때문이다.
이벤트 루프
위에서 말한 이벤트 루프란 Call Stack과 task Queue에 있는 콜백함수 들을 순차적으로 call stack으로 밀어넣어 주는 역할을 합니다. 이러한 반복적인 행동을 틱 이라 부릅니다.