쓰레드를 잘 배분한다 했어도 작업에 따라 한곳으로 요청이 몰릴 수가 있는데 

 

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

+ Recent posts