개요
CS 테스트에 나왔으나 답을 제대로 작성하지 못해 복기 차원에서 공부를 진행하였다.
Thread Pool과 유사한 내용인 줄 알았으나 TLS와 Thread Pool은 완전히 다른 개념이었다.
TLS는 각 스레드가 독립적으로 접근할 수 있는 저장소로, 전역 변수처럼 사용되지만 각 스레드마다 별도의 인스턴스를 가지는 메모리 영역을 의미한다. 전역 변수처럼 어디서든 접근할 수 있지만, 실제로는 각 스레드마다 별도의 인스턴스를 가진다.
TLS는 멀티스레드 환경에서 동기화 없이도 안전한 데이터 관리를 가능하게 하는 강력한 도구지만, 메모리 사용량과 초기화 비용을 고려해서 적절히 사용해야한다.
// 전역 변수 (모든 스레드가 공유)
int global_var = 0;
// TLS 변수 (각 스레드마다 독립적)
thread_local int tls_var = 0;
동작 원리
1. 메모리 구조
- 각 스레드 생성 시 TLS 블록이 할당됨
- 스레드 스택과는 별도의 메모리 영역
- OS나 런타임이 스레드 ID를 통해 해당 TLS 블록에 접근
2. 접근 메커니즘
- TLS 변수 접근 시 현재 스레드 ID 확인
- 해당 스레드의 TLS 블록에서 변수 위치 계산
- 실제 메모리 주소로 변환하여 접근
구현 방식
1. C++11 thread_local 변수 타입 사용
#include <thread>
#include <iostream>
thread_local int counter = 0;
void worker_function(int thread_id) {
for(int i = 0; i < 5; i++) {
counter++;
std::cout << "Thread " << thread_id
<< ": counter = " << counter << std::endl;
}
}
int main() {
std::thread t1(worker_function, 1);
std::thread t2(worker_function, 2);
t1.join();
t2.join();
return 0;
}
// 각 스레드마다 독립적인 counter 값을 가짐
2. POSIX 환경 pthread 사용
#include <pthread.h>
pthread_key_t tls_key;
void InitializeTLS() {
pthread_key_create(&tls_key, NULL);
}
void SetTLSValue(void* value) {
pthread_setspecific(tls_key, value);
}
void* GetTLSValue() {
return pthread_getspecific(tls_key);
}
성능 특성
1. 접근 속도
- 일반 전역 변수보다는 느림 (주소 계산 오버헤드)
- 뮤텍스 사용보다는 훨씬 빠름
- 캐시 지역성이 좋음 (같은 스레드에서 반복 접근)
2. 메모리 사용량
스레드 수 × TLS 변수 크기 = 총 메모리 사용량
주의사항 및 한계
1. 메모리 누수 위험
thread_local MyClass* ptr = nullptr;
// 스레드 종료 시 자동으로 소멸자가 호출되지만
// 동적 할당된 메모리는 직접 해제해야 함
void cleanup() {
delete ptr; // 필요시 명시적 해제
}
2. 초기화 타이밍
thread_local ExpensiveObject obj; // 첫 접근 시 초기화
void function() {
// 첫 호출 시 ExpensiveObject 생성자 실행
obj.do_something();
}
Thread Pool과의 차이점
1. Thread Pool
- 미리 생성해둔 스레드들의 집합
- 작업 큐에서 작업을 가져와 처리하는 패턴
- 스레드 생성/소멸 비용을 줄이는 것이 목적
2. TLS(Thread Local Storage)
- 각 스레드마다 독립적인 저장 공간
- 전역 변수처럼 접근하지만 스레드별로 다른 값을 가짐
- 스레드 안전성을 위한 메모리 관리 기법
728x90
'컴퓨터 과학(CS) > 운영체제' 카테고리의 다른 글
프로세스 (process) (0) | 2024.08.28 |
---|---|
멀티 쓰레딩 (Multi-threading) (0) | 2024.08.28 |
운영체제(OS) (0) | 2024.08.16 |