자바스크립트를 공부하다 보면 자바스크립트는 싱글스레드인지, 멀티스레드인지에 대해 알게 되고 고민하게 되는 시간이 있을 것이다. 그 시간을 위해 간단하게 사용되는 스레드와 프로세스 등의 개념을 간단히 살펴보려고 한다. 개념들의 정리 이후에 자바스크립트를 다시 한번 살펴보면 그 이해가 더 깊어질 것이라고 생각한다.
글의 순서로는 먼저 각각의 개념에 대해 살펴보고 이후에는 예시를 통해 역할들을 정리해보려한다. 예시까지 이해를 하고 나서 다시 한번 개념에 대해 읽어보는 것을 추천한다.
프로세스(Process)와 쓰레드(Thread)는 컴퓨터에서 동시에 실행될 수 있는 작업의 단위이다. 하지만 둘은 목적과 특징이 다르다.
프로그램(Program)
파일 시스템에 존재하는 실행파일
➡️ .exe로 끝나는 파일을 프로그램이라고 생각하면 된다. 예전 게임 중 바람의 나라. exe라던지 한글. exe 등이 프로그램이다
프로세스(Process)
프로세스란 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다
스레드(Thread)
어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위 / 프로세스는 스레드를 여러 개 생성해 여러 작업을 처리가능 / 프로세스가 할당받은 자원을 이용하는 실행의 단위 → 프로그램을 더블클릭으로 실행하게 되면 CPU를 차지하면서 수행을 담당하는 수행 주체가 바로 프로세스이다.
- 스레드는 프로세스 내에서 각각 stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
- 스레드는 프로세스 내의 주소공간이나 자원들을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
- 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스 메모리에 직접 접근할 수 없다. 프로세스 내부에 있는 메모리를 공유하기 때문에 프로세스 간 메모리 공유보다 더 쉽다
- 스레드는 프로세스 내에서 생성되고 제거되며, 하나의 프로세스 내에서 여러 개의 스레드가 동시 작업할 수 있다.
📌 싱글 스레드
- 직렬 형태로 하나의 스레드가 하나의 작업만 수행하며 순서대로 처리
- 자원접근에 대한 동기화
- 효율성이 떨어짐
📌 멀티스레드
- 병렬로 일을 처리하여 여러가지 스레드를 한꺼번에 처리 → 효율적
- 둘 이상의 스레드가 동시에 실행하며 문제를 일으킬 수 있다.
- 둘 이상의 스레드에서 공유 자원에 접근할때 다른 스레드에서 사용 중인 경우 값을 읽어올때 동기화 문제가 발생할 수 있다.(순서가 중요한데 그 순서에 대한 문제가 발생할 수 있다)
프로세스와 스레드의 차이
- 프로세스는 독립적인 메모리 영역을 가지고 있으며, 스레드는 공유 메모리 영역을 가진다
- 하나의 프로세스가 종료되면 그와 관련된 모든 자원들이 반환되지만, 스레드는 다른 쓰레드에 의해 영향을 받을 수 있다.
- 프로세스 간 통신(IPC)은 복잡하고 속도가 느리지만, 쓰레드 간 통신은 간단하고 빠르다
프로세스는 독립적으로 실행되어야 하는 프로그램을 구현할 때 사용하고, 쓰레드는 동시에 실행되어야 하는 작업을 구현할 때 사용한다.
예시 ?
우리의 일상생활을 생각해 보면 보다 이해가 쉬울 것이다.
- 구글 크롬으로 유튜브를 들어가 노래를 들으며 바람의 나라를 하다가 카톡이 오면 넘어가서 카톡 하고 다시 게임으로 돌아가는 것을 생각해 보자. 너무나 일반적인 상황이다
- 여기서 보면 구글 크롬, 바람의 나라, 카카오톡이라는 프로그램을 실행시켜서 3개의 프로세스를 만든 것이다.
- 스레드를 알아보며 생각난 비유가 있는데 이게 정확한 내용인지는 모르겠지만 비슷하지 않을까 생각된다. (혹시라도 아시는 분이 계시다면 알려주시면 감사하겠습니다)
- ⁉️ 보통 크롬 브라우저를 사용할 때 여러 개의 탭을 띄워놓고 사용한다. 예를 들어 쿠팡에서 여러개의 물건을 비교하여 구매하기 위해 여러개의 탭을 띄워놓는데 그중 하나의 탭에서 로그인을 하고 다른 탭에 가서 새로고침을 한다면 그 탭도 로그인이 된 상태로 변경된다. 이런 부분에서 하나의 프로세스 안에 있는 스레드는 메모리들을 공유하니 가능한 게 아닐까?! 하는 생각을 해보았다.
"자바스크립트는 멀티스레드가 아닌 싱글스레드를 사용하는 언어이다. 하지만 하나의 스레드에서 비동기적 실행을 통해 멀티스레드처럼 작동하는 것이다." 이 말을 이해 하기 위해 스레드와 프로세스가 무엇인지 알아보았다면 이제는 비동기적 실행이 무엇인지 동기적 실행과 비교하여 정리를 해보도록 하겠다.
개념정리를 통해 내가 사용하고 있는 자바스크립트의 특성을 정확히 이해하고 더 나아가 Node.js와 그 작동방식등에 대해서도 더 깊은 이해를 할 수 있는 뜻 깊은 시간을 가지고 있다. 내가 사용하고 있는 언어와 프레임워크를 그냥 사용하는게 아니라, 내가 왜 사용하는지, 어떤 특성 때문에 사용하는지 계속 고민하는 시간을 가져보려고 한다.
'TIL' 카테고리의 다른 글
Libuv 라이브러리(feat. 이벤트 루프) - 3 (0) | 2023.03.24 |
---|---|
V8엔진 구조 및 작동 방법 - 2 (0) | 2023.03.23 |
나는 왜 Node.js를 사용했을까? - 1 (0) | 2023.03.15 |
API가 도대체 뭐야? 이걸로 끝내자 (0) | 2023.03.10 |
나는 왜 JWT를 사용했을까?(feat. 쿠키,세션,토큰) (0) | 2023.03.09 |