본문 바로가기
Netty Framework/Thread

쓰레드(Thread)의 기본개념

by 거북이의 기술블로그 2025. 3. 12.
* 블로그 글을 읽기 전 *
- 개념에 대해 주관적인 해석과 판단이 들어가 있으므로 정확하지 않을 수 있습니다 -



스레드 (Thread)란?

스레드는 컴퓨터가 하나의 작업을 처리하는 가장 작은 단위를 나타냅니다. 반면, 프로세스는 하나의 프로그램이 실행되는 단위라고 볼 수 있습니다.

이 두 개념은 서로 비교되는 경우가 많습니다. 크기(단위)는 다르지만, 결국 컴퓨터가 작업을 처리하는 방식과 관련이 있기 때문입니다.

그렇다면 컴퓨터가 작업을 처리한다는 것은 무엇을 의미할까요?

컴퓨터는 저장된 데이터를 활용하거나 새로운 데이터를 입력받아 연산을 수행한 뒤, 결과를 도출하는 역할을 합니다. 이러한 일련의 과정을 우리는 "컴퓨터가 작업을 처리한다"라고 표현합니다. 이때, 컴퓨터가 이 작업을 프로세스로 처리할지, 아니면 스레드로 처리할지 결정해야 합니다.

일반적으로 간단한 프로그램에서는 하나의 프로세스 내부에서 하나의 스레드를 사용하여 처리합니다. 컴퓨터는 사람이 인식하는 시간보다 훨씬 빠르게 작업을 수행하므로, 단순한 프로그램에서는 멀티스레드나 멀티프로세스의 차이가 크게 느껴지지 않을 수 있습니다.

하지만 여러 사용자가 동시에 서비스를 이용하거나, 0.01초의 응답 속도 차이가 중요한 환경에서는 컴퓨터의 성능을 최대한 활용해야 합니다. 이때, 효율적인 처리를 위해 프로세스와 스레드를 고려하게 됩니다.

 

 

프로세스 vs 스레드

현대의 컴퓨터는 하나의 CPU 안에 여러 개의 코어를 포함하고 있습니다. 코어가 여러 개인 이유는 단순히 하나의 코어 성능을 높이는 것보다, 여러 개의 코어를 병렬로 활용하는 것이 비용 대비 성능이 뛰어나기 때문입니다.

운영체제(OS)는 여러 개의 프로세스와 스레드를 적절히 배분하여 컴퓨터가 원활하게 동작하도록 관리합니다. OS가 프로세스를 관리하는 방식까지 깊이 이해할 필요는 없지만, 기본적인 원리는 알고 있어야 합니다.

운영체제는 CPU를 여러 프로세스와 스레드에 번갈아 가며 할당하는데, 이 과정에서 Context Switching이라는 개념이 등장합니다.
Context Switching이란?
Context Switching은 CPU가 실행 중인 프로세스를 변경할 때 발생하는 작업 전환 과정을 의미합니다.

예를 들어, 우리가 어떤 일을 하다가 갑자기 다른 업무를 해야 한다면, 새로운 업무를 수행하기 위해 준비하는 시간이 필요합니다. CPU도 마찬가지로, 실행 중인 작업을 멈추고 다른 작업을 수행하려면 현재 상태(Context)를 저장하고 새로운 작업의 Context를 불러와야 합니다.

프로세스 간 전환(Context Switching)은 독립적인 메모리를 사용하기 때문에 비용이 높습니다. 운영체제는 CPU 여러 개를 이용하여 여러 프로세스를 번갈아 실행하는데, 이 과정에서 발생하는 Context Switching은 성능 저하를 유발할 수 있습니다.

 

멀티프로세스

우리는 하나의 작업을 끝내기 위해 여러 개의 프로세스를 생성하여 처리할 수 있습니다. 이를 **멀티프로세스(Multi-Process)**라고 합니다.

멀티프로세스는 각 프로세스가 독립적인 메모리를 사용하므로, 서로 자원을 공유할 필요가 없습니다. 따라서 안정성이 높고, 한 프로세스가 문제가 발생하더라도 다른 프로세스에 영향을 미치지 않는 장점이 있습니다.

하지만, 단점도 있습니다.

1. 프로세스 간 데이터를 주고받으려면 별도의 IPC(Inter-Process Communication) 기법이 필요합니다.
2. Context Switching 비용이 높아 성능 저하가 발생할 수 있습니다.
3. 메모리를 독립적으로 할당하기 때문에 메모리 사용량이 증가합니다.

 

멀티스레드

멀티프로세스 문제를 해결하기 위해 등장한 개념이 바로 **멀티스레드(Multi-Thread)**입니다.

멀티스레드는 하나의 프로세스 내에서 여러 개의 스레드를 실행하는 방식입니다.

(장점)
1. 프로세스 내에서 메모리를 공유하기 때문에 Context Switching 비용이 낮습니다.
2. 데이터를 공유할 수 있으므로 프로세스 간 통신(IPC)이 필요하지 않습니다.
3. 빠른 응답 속도를 요구하는 서비스에서 효과적입니다.

하지만, 멀티스레드도 단점이 있습니다.

(단점)
1. 메모리를 공유하기 때문에 동기화 문제가 발생할 수 있습니다.
2. 잘못된 스레드 동기화(예: race condition)가 발생하면 디버깅이 어렵습니다.
3. 스레드 개수 선정이 중요하며, 과도하게 사용하면 오히려 성능이 저하될 수 있습니다

 

메모리  구조

간단히 설명하자면, code와 data는 프로그램이 구동되면 고정적으로 들어와지는 불변의 변수들이다.
컴퓨터가 해당 프로그램의 명령을 가져다 쓰려면 code가 필요하고, 전역변수와 static변수들은 프로그램 구동시에는 항상 생성되어있어야 하기에 프로세스가 시작될때 로드되게 된다.

 프로세스는 이러한 메모리를 각자가 독립적으로 관리되고, Context Switching이 일어날때마다 이러한 메모리에 들어있는 값들을 새롭게 불러와야하는 비용이 든다.

 스레드의 경우는 stack을 제외하고는, code/data/heap의 데이터 내용들을 공유하게 된다. 이로써 메모리를 새롭게 로드해야하는 문제는 없지만, 공유되는 자원들을 잘 관리해야한다는 위험성이 존재하게 된다.
불변객체와 코드값이라면 상관없겠지만, 전역변수와 동적할당 변수의 경우 공유가 가능하기에 적절한 기술들을 이용하여 관리해줘야한다.

 적절한 기술들의 경우 대표적으로는 lock이 있을것이고, 새로운 객체로 생성(복사 -> 스레드 로컬복사), 불변객체 등 "Thread Safe"라는 키워드를 이용하여 더 자세하게 찾아볼 수 있다
(추후 Thread Safe 관련하여 포스팅 진행 예정..!) 

 

프로세스 vs 스레드

프로세스 비교 스레드
CPU 할당 + 메모리 로드 Context Switching CPU 할당
독립적인 메모리 공유 자원 Stack을 제외한 메모리 공유
네트워크통신, 파이프방식, 공유메모리 (*IPC 방법) 전송방법 메모리 공유
독립적이므로 높음 안정성 자원을 공유하므로 낮음
느림 속도 빠름

 

결론

스레드와 프로세스는 항상 비교되는 개념이며, 각각의 장단점이 있습니다. 스레드는 CPU 자원을 보다 효율적으로 사용할 수 있지만, 메모리 공유로 인해 동기화 문제가 발생할 수 있습니다. 반면, 프로세스는 안정적인 실행이 가능하지만, Context Switching 비용이 높아질 수 있습니다.

따라서, 개발자는 특정 프로그램이 어떤 방식으로 동작해야 하는지를 고려하여 멀티프로세스를 사용할지, 멀티스레드를 사용할지 결정해야 합니다.