기술 면접을 대비해 개념을 🍰 한입 크기로 잘라 정리합니다.
깃허브가 궁금하다면 놀러오세요!
👉 깃허브 보러가기 (Since 2023.05.10 ~ )
알려지다시피, 자바스크립트는 싱글 스레드 언어
이다. 단순히 생각해보면 하나보다는 여러 스레드로 작업하면 더 좋지 않을까? 라는 생각이 드는데, 왜 자바스크립트는 싱글 스레드를 선택했을까?
여기서 짚고 넘어가야할 것은 모든 기술에는 각각의 기회 비용이 존재하고, 싱글 스레드와 멀티 스레드 역시 각각의 장점에 맞는 기회비용들이 존재한다.
이번 시간엔 싱글 스레드와 멀티 스레드의 차이점은 무엇인지, 그리고 각각의 장단점에 대해 알아보는 시간을 갖도록 하자!
하나의 프로세스에 오직 하나의 스레드로만 실행되며, 따라서 하나의 레지스터와 스택으로 표현이 가능합니다.
순차 실행 방식으로, 앞선 동작이 먼저 수행되야만 이후 동작을 수행할 수 있습니다.
단일 스레드로, 비용이 적게 소요됩니다.
문맥 교환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 합니다.
여러 개의 스레드가 프로세스의 자원을 공유할 경우, 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근을 제어해야 합니다. 쉽게 말해 모든 스레드가 일정 자원에 동시에 접근하거나, 똑같은 작업을 실행하려고 하면 에러가 발생하거나 원하는 값이 나오지 않습니다. 때문에 스레드들이 동시에 같은 자원에 접근하지 못하도록 제어해주어야합니다. 이때 해당 많은 비용을 발생시킵니다.
싱글스레드에서 프로세서를 최대한 활용하기 위해선 Cluster 모듈을 사용하거나 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야합니다. 뿐만 아니라 다수의 프로그램 인트턴스가 어떻게 상태를 공유할 것인지도 고려해야 합니다.
많은 연산 시간이 필요한 작업의 경우, 작업이 완료되어야 다음 작업을 진행할 수 있기에 유저 경험에 좋지 않은 영향을 줍니다.
반면 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복합니다. (단 새로운 스레드 생성이나 놀고 있는 스레드 처리 비용이 발생할 수 있습니다)
멀티 스레드는 CPU의 최대 활용을 위해 프로그램의 둘 이상을 동시에 실행하는 기술로, 컨텍스트 스위칭을 통해서 이뤄집니다.
메인 스레드 외의 추가적인 스레드를 이용하여 병렬적으로 작업을 처리한다는 특징이 있습니다.
💡 컨텍스트 스위칭(Context Switching)이란?
- CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 과정을 말합니다.
- 구체적으로, 동작 중인 프로세스가 대기 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말합니다.
프로그램의 일부분(스레드 중 하나)이 중단되거나, 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가합니다. 즉 에러 발생 시 즉시 새로운 스레드를 생성해 극복합니다. 단 이 때 새 스레드 생성과 놀고 있는 스체드 처리에 따른 비용이 발생할 수 있습니다.
프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 줄어듭니다. 또한 스레드간 컨텍스트 스위칭은 캐시 메모리를 비울 필요가 없기 때문에 더 빠른 속도를 보장합니다.
다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 병렬성이 증가합니다.
컨텍스트 스위칭, 동기화 등으로 오히려 단일 스레드보다 더 많은 시간이 소요될 수 있습니다.
동기화가 필수적입니다.
스레드는 데이터와 힙 영역을 공유하기 때문에, 공유하는 자원에 동시에 접근하는 경우, 다른 스레드에서 사용중인 변수나 자료구조에 접근해 엉뚱한 값을 읽어오거나 수정할 수 있습니다. 따라서 동기화가 필수적입니다.
멀티 스레딩을 위해서는 운영체제의 지원이 필요합니다.
프로그래밍 난이도가 높고, 스레드 수만큼 많은 자원을 필요로 합니다.
📎 참고문서