쓰레드를 잘 배분한다 했어도 작업에 따라 한곳으로 요청이 몰릴 수가 있는데
Headp, Data 영역은 쓰레드들 끼리 공유해서 사용하게 되어 lock 등으로 제어를 해줘야 한다
TLS 라는게 스택과 (Heap,Data ) 영역 사이에 중간에 있는데 이건 (Heap,Data ) 의 데이터를 각 쓰레드에 배정된 TLS 에 독자적으로 올려 사용 할 수 있다
(Heap,Data ) 를 쓰려면 동기화 처리를 해야 했지만 필요한것만 TLS 에 옮겨 놓음
즉 TLS 쓰레드마다 갖고 있는 로컬 저장소인 것이다
(Heap,Data ) 영역을 서로 갔다 쓰려고 하면 병합이 일어나고 그럼 느려지게 되는데
자기가 사용할것을 덩어리로 갖고와 놓는 영역을 TLS 라 한다
그리고 전역으로도 사용 할수 있지만 다른 것들은 접근 불가능하고 해당 스레드만 접근 가능하게 된다
정리 하자면 (Heap,Data ) 큰 메모리 영역에서 필요한 메모리 덩어리만 TLS 에 옮겨놓고 작업 할수 있게 된다
스택과 차이점은 스택은 함수가 종료되면 메모리가 날라가듯이 지속적이진 않은데 TLS 는 전역이라 지속성이 있다
전역 변수로도 사용 할수 있지만 다른 쓰레드는 접근 불가능하다
예시..
#include "pch.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <future>
#include "windows.h"
using namespace std;
//thread_local 이것이 TLS (Thread Local Storage)
thread_local int32 LThreadId = 0;
void ThreadMain(int32 threadId)
{
LThreadId = threadId;
while (true)
{
cout << "thread ID " << LThreadId << endl;
this_thread::sleep_for(1s);
}
}
int main()
{
vector<thread> threads;
for (int32 i = 0; i < 10; ++i)
{
//쓰레드가 자신만의 ID 를 부여 받게 됨
int32 threadId = i + 1;
threads.push_back(thread(ThreadMain, threadId));
}
for (thread& t : threads)
{
t.join();
}
return 0;
}
위 코드에서 보면
//thread_local 이것이 TLS (Thread Local Storage)
thread_local int32 LThreadId = 0;
이 부분이 Thread Local Storage 를 사용 한 것이고 이 변수는 TLS 에 저장 되는 것임으로
일반 데이터 영역에 들어가는게 아니기 때문에 변수는 하나 선언한것 같지만
각 쓰레드마 별도의 TLS 영역에 들어가는 것이라 아래와 같은 thread id 를 각 쓰레드마다 출력하고 있다는 것을 알 수 있다 (결과 창은 멀티스레드 환경이라 꼬여보일 순 있음)
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
LockBase Queue (0) | 2022.09.14 |
---|---|
Lock base Stack (0) | 2022.09.14 |
Sequential consistency (순차 일관성) (0) | 2022.09.13 |
Singleton multithreading programs (2) (0) | 2022.09.13 |
Singleton multithreading programs (1) (0) | 2022.09.13 |