이 질문에 대답을 하기 전에
스레드가 뭔지를 알아야한다.
우리가 자주 쓰는 프로그램, 뭐 크롬이라는 브라우저를 예로 들어보자.
크롬은 사용자가 클릭해서 실행할 때
컴퓨터로부터 메모리라는 자원을 할당받게 되고
그 메모리를 할당받았을 때 비로소 프로세스라고 부른다.
스레드는 이 프로세스의 실행단위이다.
브라우저는 보통 멀티스레드이기 때문에 동시에 다양한 작업을 할 수 있다.
예를 들어 한쪽에 유튜브에 영상을 틀어놓고 댓글을 쓰기등..
여기에 더 나아가서 크롬의 경우에는 각 탭마다 프로세스이고
여러 탭을 사용하게 되면 이는 멀티 프로세스가 된다.
아무튼 이 실행단위가 하나인지, 여러개인지에 따라 각각 싱글, 멀티 스레드라고 부른다.
그렇다면, 실행단위가 싱글인것보다 멀티인것이 더 좋은거 아닐까?
다다익선이니까! 멀티프로세스에 멀티스레드가 제일 좋은거 아닌가 라고 생각할 수도 있는데 꼭 그렇지만은 않다.
프로그래밍에 있어 모든 것은 비용이다.
멀티프로세스를 구축하는 것보다는 당장 스레드를 몇개 더 추가하는 것이
메모리를 덜 사용하니까 멀티스레드의 비용이 상대적으로 크지 않다고 볼 수 있다.
그래서 얼핏보면 멀티스레드의 단점이 없어보이지만
이 멀티스레드도 한정된 자원을 공유하기 때문에 임계영역에 대해 동기화를 해야한다는 제한이 있다.
임계영역이란 영어로 Critical Section 인데 공유되는 자원, 즉 동시접근하려고 하는 자원에서 문제가 발생하지 않게 독점을 보장해줘야 하는 영역이다. 처음 들었다면 점점 무슨말인지 모르겠고 헷갈리는게 정상이다.
쉽게 말해 누가 화장실에 들어가있을 때 그 화장실칸은 오로지 안에 있는 사람만 사용할 수 있어야 하는데
누가 갑자기 벌컥 문 열고 들어오면 문제가 생기니까 못들어오게 해야한다는 것이다.
여기서 이 화장실이 임계영역이고 들어오는 사람이 스레드라고 보면 된다.
이 임계영역의 배타적 사용을 보장받기 위해 뮤텍스나 세마포어같은 동기화 매커니즘이 사용되는데
뮤텍스는 한마디로 화장실에 누가 들어가있을 때 못들어가게 잠구는 것과 비슷하며
세마포어는 주차장 빈 자리 보여주는 모니터처럼 들어갈 수 있는 빈 화장실이 몇개 있는지 알려줘서
그거 보고 들어가는 것과 비슷하다.
아무튼 이 멀티스레드라는 것이 임계영역의 배타적 사용을 보장받기 위해 동기화 매커니즘을 사용하다보면
컨텍스트 스위칭이라는 것이 발생한다.
컨텍스트는
스레드가 가지고 있는 작업에 대한 기본적인 정보들이며
컨텍스트 스위칭은
현재 진행하고 있는 작업의 상태를 저장하고 다음 진행할 작업의 상태 값을 읽어 적용하는 과정이라고 표현하기도 한다.
그리고 이 스위칭이 자주 발생하게 되면 오버헤드라고 하는 추가적인 비용이 발생하는데 이는 성능 저하를 야기한다.
그래서 많은 프로그램을 띄워놓고 작업하면 컨텍스트 스위칭이 매우 빈번하게 발생하며, 다시 차례가 돌아오기까지의 시간이 더 소비되기 때문에 메모리를 더 많이 사용하게 되고 속도가 상당히 떨어짐을 느낄 수 있는 것이다.
그러면 언제 싱글 스레드를 쓰고 언제 멀티 스레드를 써야할까?
작업의 특성, 성능 요구 사항, 병렬 처리 활용 능력에 따라 달라지겠지만 기본적으로 단일 스레딩은 동시 실행이 필요하지 않은 간단한 작업이나 시나리오에 적합하며, 멀티 스레딩은 병렬 처리가 가능하고 더 나은 성능이나 응답성이 필요한 작업에 유용하다.
자바스크립트는 싱글 스레드인데 그럼 병렬 처리는 어떻게 하며 백그라운드에서 24/7 돌려야 하는 타이머 기능은 도대체 어떻게 쓰는걸까?
두가지 방법이 있는데 비동기처리를 하거나 최신 브라우저의 힘을 빌려 웹워커와 같은 백그라운드 스레드를 쓰는것이다.
이렇게 되면 마치 멀티 스레드를 쓰는 것과 같게 되니 멀티 스레딩의 장점을 가져다 쓸 수 있다.
다음 글은 이 최신 브라우저에서 제공하는 웹 워커를 다루도록 하겠다.
'개발자 전향 프로젝트' 카테고리의 다른 글
QueryDSL 다른 조건으로 같은 테이블 여러번 조인하기 (0) | 2024.04.05 |
---|---|
웹 워커(Web Worker)란? 언제 쓰는 걸까? feat.타이머 (0) | 2024.02.16 |
React 입문 - React, JSX, Babel, 그리고 Webpack 이해하기 (1) | 2024.02.15 |
Callback에 대한 의문과 Promise 와 Async/Await 를 쓰는 이유 (feat.비동기vs동기) (1) | 2024.01.30 |
ajax로 JSON 객체 배열 넘기기 (파이썬 장고) (0) | 2023.12.20 |