(TIL) 2025-01-15
(TIL) 2025-01-15
스레드(Thread)
스레드는 운영 체제에서 실행되는 프로그램의 가장 작은 실행 단위이다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 같은 메모리 공간에서 동작하는 여러 실행 단위를 통해 병렬 처리가 가능하다.
특징
프로세스와의 관계:
- 프로세스: 독립된 실행 단위로, 고유한 메모리 공간(Code, Data, Heap, Stack)을 가짐.
- 스레드: 하나의 프로세스 내에서 실행되는 작은 단위로, 다른 스레드와 메모리(Heap, Data)를 공유.
공유와 독립:
- 공유: 스레드는 프로세스의 Code, Data, Heap 영역을 공유함.
- 독립: 각 스레드는 자신의 고유한 Stack 영역과 CPU 레지스터를 가짐.
병렬 처리:
- 여러 스레드를 사용하면 프로그램이 동시에 여러 작업을 수행할 수 있어 성능을 향상시킴.
- 예: 웹 서버는 스레드를 사용하여 다수의 클라이언트 요청을 동시에 처리.
장점
- 응답성: 긴 작업을 다른 스레드에서 실행하여 메인 스레드의 응답성을 유지.
- 자원 효율성: 프로세스보다 생성, 종료, 컨텍스트 스위칭 비용이 낮음.
- 병렬 처리: 멀티코어 환경에서 성능을 극대화.
단점
- 동기화 문제:
- 공유 자원을 사용할 때 발생하는 경쟁 상태(Race Condition)를 처리해야 함.
- 이를 위해 락(Lock), 뮤텍스(Mutex), 세마포어(Semaphore) 같은 동기화 기법이 필요.
- 디버깅 어려움:
- 동시성 문제는 재현이 어렵고 디버깅이 복잡함.
- 복잡성 증가:
- 설계와 구현의 복잡성이 높아지고, 잘못된 구현 시 데드락(Deadlock)과 같은 문제가 발생할 수 있음.
종류
유저 스레드(User Thread):
- 응용 프로그램 수준에서 관리되는 스레드.
- 운영체제의 커널이 관여하지 않음.
- 단점: 하나의 스레드가 블록되면 전체 프로세스가 블록될 수 있음.
커널 스레드(Kernel Thread):
- 운영체제 커널에서 직접 관리하는 스레드.
- 블록된 스레드만 대기 상태가 되고, 다른 스레드는 실행 가능.
- 단점: 유저 스레드보다 관리 비용이 큼.
하이브리드 스레드:
- 유저 스레드와 커널 스레드의 장점을 조합한 방식.
예시(javascript)
JavaScript는 전통적인 스레드를 지원하지 않지만, 웹 워커(Web Worker)로 스레드와 비슷한 작업을 수행 가능.
1
2
3
4
5
6
7
8
9
10
11
// worker.js
self.onmessage = function (e) {
self.postMessage(`Received: ${e.data}`);
};
// main.js
const worker = new Worker("worker.js");
worker.onmessage = function (e) {
console.log(e.data);
};
worker.postMessage("Hello, Worker!");
실제 사례
- 멀티스레드 웹 서버: 여러 클라이언트 요청을 동시에 처리.
- 백그라운드 작업: 파일 다운로드, 데이터 처리, 백업 등 메인 작업을 방해하지 않는 비동기 작업.
- 병렬 계산: 멀티코어 프로세서를 활용한 대규모 데이터 병렬 처리.
스레드의 효율적인 사용은 프로그램 성능을 극대화하지만, 동기화와 설계의 복잡성을 고려하여 신중히 사용해야 한다.
This post is licensed under CC BY 4.0 by the author.