[CS] - 스레드(Thread)란 무엇인가?
스레드(Thread)
Thread가 뭐야?
얼마 전 브라우저에 대해 궁금해서 검색하던 중, 싱글스레드(Single Thread), 멀티스레드(Multi Thread)라는 단어가 등장했다.
아직 나는 이게 어떤 것인지 몰랐고, thread가 무엇인지 먼저 알아야겠다 생각이 들었다.
그렇다면 내가 알아본 thread는 무엇일까?
Thread 정의
In computer science, a thread of execution is the smallest sequense of programmed instructions that can be managed independently by a scheduler, which is typically a part of the operating system. - 출처: Wikipedia
위키피디아와 chatGPT에서 검색한 내용이다.(거의 겹치는 내용이지만..)
정리하자면 thread는 프로그램에서 독립적으로 실행되는 최소한의 단위라고 할 수 있을 것 같다.
Thread의 병렬처리?
Thread는 프로그램에서 병렬적으로 처리되어 동시에 멀티태스킹이 가능하도록 만들어준다고 chatGPT에 명시되어있다.
무슨 의미일까..?
이러한 병렬 처리 과정을 잘 이해하기 위해 어떤 분이 블로그에 게임
을 예시로 들었었다.
어떤 게임을 플레이하고 있다고 생각해보자.
나는 캐릭터를 조작해 몬스터를 공격하려 한다.
이 과정에서 필요한 것은 다음과 같다.(실제로는 더 세부적으로 나뉘겠지만 예시이니 넘어가자)
- 캐릭터가 공격 모션을 취한다.
- 몬스터가 피격 모션을 취한다.
- 몬스터의 피격 또는 캐릭터 공격 소리가 출력된다.
- 경험치, 몬스터의 체력 등 게임 내 상태가 변한다.
각각의 과정이 하나의 process 또는 thread로 나눠져 있다고 생각해보자.
위 과정들은 모두 동시에 진행되어야 한다.(또는 동시에 진행되는 것처럼 보여야 한다.)
그렇지 않고 하나씩 진행된다면, 캐릭터가 공격하고 몬스터의 체력이 감소하는 과정에서 딜레이가 발생할 것이다.
이 딜레이는 여러 몬스터를 동시에 공격할 경우 더 커져 게임 플레이에 큰 방해 요소로 작용할 것이다.
이러한 현상을 방지하기 위해 여러 thread를 동시에 실행하는 병렬 처리를 한다고 이해하면 된다.
그러나 여기서 굉장히 중요한 부분을 짚고 가야한다.
바로 CPU는 한 번에 하나의 thread만을 처리할 수 있다는 것이다.
이게 왜 중요하냐면 한 번에 하나의 thread만 처리할 수 있는 CPU가 어떻게 병렬 처리를 할 수 있냐는 것이다.
CPU의 thread 병렬처리시스템 원리 이해
CPU의 병렬처리시스템은 사실 여러 thread를 동시에 처리하는 것이 아닌, 동시에 처리하는 것처럼 보이게 만든다.
뭔 말이냐?
이번에도 이해하기 쉽게 예시를 들어보자.

어떤 한 농부가 A, B, C 총 3개의 우물을 파려고 한다.
농부는 A, B, C 3개의 우물을 모두 동시에 파고 싶지만, 농부는 1명이다.
그래서 농부는 하나의 방법을 찾게 되는데,

A를 10cm파고, B를 10cm파고, C를 10cm판 뒤 다시 A로가 위 과정을 반복하는 것이다.
그런데 이 과정을 우리의 눈으로 캐치하지 못할 정도로 빠르게 수행한다면?
아마 A, B, C 3개의 우물이 동시에 파여지고 있다고 느낄 것이다.
여기서 농부를 CPU, 하나의 우물을 하나의 thread로 대입하면 이것이 바로 병렬처리시스템의 원리이다.
실제 CPU의 thread 처리는 굉장히 빠른 시간에 일어난다.
그렇기 때문에 이러한 방법을 이용한다면 마치 여러 thread가 동시에 실행되는 것처럼 보인다.
여기서 알고 가야하는 중요한 keyword
이렇게 CPU가 병렬 처리를 위해 thread간 이동하는 것을 Context Switching
이라고 한다.
위에서
게임
을 예시로 들었었다. 우리는 게임을 플레이하면서 갑자기 렉이 걸릴 경우, bgm이 굉장히 늘어지거나 끊기며 재생되는 경험을 했을 것이다.
이 경우가 접속때문이라면, 병렬처리 때문에bgm 재생 -> 접속 -> bgm 재생
이라는 처리 과정에서 접속에 대한 처리 과정이 길어져 연속적인 bgm재생이 이루어지지 않아 발생하는 현상이라 할 수 있겠다.
Process와 thread
제일 위의 chatGPT의 설명을 보면
Threads are sometimes called lightweight processes
이라는 문장이 있다. Process는 무엇이고, thread와 어떻게 다르며, lightweight process
는 무엇을 의미할까?

하나의 프로그램을 실행하기 위해선 여러 process를 실행해야 하고, 이 process들은 다시 하나 이상의 thread로 나뉘어진다.
더 자세히 알아보자
Process의 구조
Process의 memory 구조는 Code, Data, Heap, Stack 영역으로 구분되어 있다.

보기 쉽게 이런 모식도로 그려봤다.
Process는 이렇게 실행시키기 위한 여러 정보가 담겨있다.
그런데 우리는 thread에 대해 공부하고 있지 않은가?
이런 process의 구조와 thread가 무슨 관계가 있을까?

바로 process가 이렇게 여러 thread로 나뉠 수 있다.
하나의 process는 이처럼 여러 thread로 나뉠 수 있고, 단 하나만의 thread를 가질 수도 있다.
여기서 더 나아가 multi process
와 multi thread
의 차이. lightweight process
가 무엇인지까지 알 수 있게 된다.
Multi process, multi thread
위에서 하나의 process를 여러 thread로 나눈 것은 multi thread
라고 한다.
반면 그림의 왼쪽처럼 여러 process를 설정하는 것을 multi process
라고 한다.
두 가지 방식의 차이점은 다음과 같다.
- 그림에서
multi process
는 3칸의 메모리,multi thread
는 1칸의 메모리를 가지고 있다. 즉,multi thread
가 적은 메모리 공간을 차지한다. Multi thread
는 하나의 메모리에서 Code, Heap, Data 등은 공유하기 때문에context switching
이 빠른 장점이 있고, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 효율적으로 자원관리가 가능하다.- Process간 통신보다 thread 간 통신 비용이 적어 작업들 간 처리비용이 감소한다.(Process는 독립적인 구조이기 때문이다.)
Multi thread
는 하나의 thread 장애로 해당 process에 존재하는 모든 thread에게 영향을 주어 안정성이 높지 않으나,multi process
는 독립적이어서 다른 process에 영향을 주지 않아 안정성이 높다.
이와 같은 차이점 때문에 어떠한 것이 우세하다 결정하지 않고, 상황에 따라 적절한 방식을 적용하는 것이 중요하다.
Lightweight process(경량 프로세스)?
자, 이제 아까 언급했던 lightweight process
에 대해 알아보자.
위에서 multi process
와 multi thread
를 나타내는 그림을 살펴보면,
multi process
에서는 각 process가 독자적인 메모리를 차지하고, 그렇기 때문에 메모리 별 독자적인 Code, Data, Heap을 메모리에 저장해야만 한다. 설사 이것들이 중복되는 process들이라 하더라도, 독립적인 성격의 process 때문에 어쩔 수 없이 중복되는 정보도 내포해야 하는 것이다.- 그러나
multi thread
는 하나의 메모리에서 Stack 별로 thread가 나뉘어 있다. 이는 해당 메모리에 저장된 Code, Data, Heap을 그 메모리의 thread끼리 공유가 가능하다는 것을 의미한다. - 그렇다면 각 process 또는 thread끼리 통신(또는 context switching)이 발생할 때,
multi process
는 무거운 정보(Code, Data, Heap, Stack이 포함된)를, 반면에multi thread
는 가벼운 정보(Stack)를 이용한다.
그러므로 thread는 경량화 프로세스(lightweight process)
라고 부를 수도 있는 것이다.
댓글남기기