컴퓨터 과학(CS)/운영체제

[운영체제] TLS(Thread Local Storage)

마달랭 2025. 6. 6. 11:37

개요

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. 접근 메커니즘

  1. TLS 변수 접근 시 현재 스레드 ID 확인
  2. 해당 스레드의 TLS 블록에서 변수 위치 계산
  3. 실제 메모리 주소로 변환하여 접근

 

구현 방식

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