SlideShare uma empresa Scribd logo
1 de 12
Baixar para ler offline
아! 그거... 모르겠습니다 - TLS 
해강입니다…
TLS는 Thread Local Storage의 약자입니다 
“용과 같이 – 유신”에서 
최적화 기법(http://www.slideshare.net/agebreak/141004-cedec-2014-1)으로 
사용했다는데 뭔지 몰라서 기록해둡니다 
멀티스레드에서 사용되는 용어이고, 아래를 참고했습니다 
MSDN : http://msdn.microsoft.com/en-us/library/ms686749.aspx 
WIKI : http://en.wikipedia.org/wiki/Thread-local_storage 
지역 저장 
잘 하게 생겼네…
기본적으로 프로세스의 모든 스레드는 가상 주소 공간을 공유합니다 
때문에 함수 안의 로컬 변수야 스레드 각각 쓰지만, static 변수나 전역 변수는 공유됩니다 
보통 이런거 접근 순서 때문에 엉뚱한 값이 되거나 DeadLock이니 뭐니 문제 만들게 되죠 
그러나 TLS를 사용하면 프로세스가 글로벌 인덱스를 사용하여, 
각각의 스레드마다 고유의 데이터를 제공합니다 
하나의 스레드안에 다른 스레드들이 특별히 이용할 수 있는 인덱스를 만들어 놓는거죠 
자기 몫은 
자기가 챙겨라 
이거지….
TLS가 작동하는 구조는 아래 그림과 같습니다 
똑같은 gdwTIsIndex2에 접근하는데 Thread1은 메모리5에, Thread2는 메모리2에 접근하죠 
TLS Index를 통해 TLS 슬롯의 메모리 블록에 접근, 각각의 lpvData값을 얻는 겁니다 
다시 말해, TLS는 스레드마다 포인터를 지정, 각각의 메모리 블록에 접근할 수 있게 해줍니다 
따라서 전역 데이터가 아닌, 서로 다른 블록의 데이터를 사용하게 되는 거죠 
Virtual table을 통한 지역변수화 정도로 이해하면 될 것 같습니다 
당신과 내가 
똑같다고 생각하면 
곤란해란 느낌…
TLS를 사용하기 위해서는 변수 선언 앞에 지정된 키워드를 적어주면 됩니다 
__declspec( thread ) int number; 
비주얼C++ 컴파일러 기준으로 제공되는 키워드입니다 
컴파일러에 따라 __thread라는 키워드를 지원하기도 합니다 
간단하지만 위와 같은 방법은 정적으로 선언하는 것이라 런타임중 로드한 dll같은 경우 
메모리 블록을 제대로 잡지 못 하는 문제가 발생할 수 있어 추천되지는 않습니다 
쉬운 길에는 
언제나 
함정이 있지….
동적으로 사용하기 위해서 제공되는 API는 다음과 같습니다 
가능한 API를 사용하라고 권장하고 있습니다 
DWORD TlsAlloc( void ); // Index 할당 
BOOL TlsSetValue( DWORD dwTlsIndex, LPVOID lpTlsValue ); // 데이터 저장 
LPVOID TlsGetValue( DWORD dwTlsIndex ); // 데이터 읽기 
BOOL TlsFree( DWORD dwTlsIndex); // 해제 
기껏 만들어줘도 
안 쓰는 사람들이 
있을지도 모르지….
간략한 코드로 보자면 이런 느낌이죠 
DWORD dwTlsIndex; 
LPVOID lpvData; 
// Index를 할당해주고 
if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) ErrorExit("TlsAlloc failed"); 
// 데이터를 저장해준 뒤 
if (! TlsSetValue(dwTlsIndex, lpvData)) ErrorExit("TlsSetValue error"); 
// 현재 스레드에 대한 데이터 포인트 검색해 읽고 
lpvData = TlsGetValue(dwTlsIndex); 
// 마지막에는 꼭 해제해줍니다 
TlsFree(dwTlsIndex); 
적절히 잘 쓰는건 
다음 문제지만….
몇 가지만 더 살펴보겠습니다 
앞에 소스에 할당할 때 나온 TLS_OUT_OF_INDEXES는 아래와 같이 정의되어 있습니다 
#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) 
그외에 TLS_MINIMUM_AVAILABLE에는 
각 프로세스에서 사용할 TLS 인덱스의 최소수가 정의되어 있습니다 
시스템에 따라 최소 64 ~ 최대 1088의 인덱스를 사용할 수 있습니다 
모른다고 
크게 문제될 것도 
없지만서도….
스레드가 생성될 때, 시스템은 LPVOID값의 배열을 할당하고 NULL값으로 초기화합니다 
인덱스를 사용하기 전에 먼저 할당하는 것을 꼭 잊지 마세요 
내부적으로 프로세스, 스레드의 진입/해제를 위해 
DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, 
DLL_THREAD_DETACH, DLL_PROCESS_DETACH를 호출합니다 
winnt.h 에 대부분 정의되어 있습니다 
보는 사람도 이제 
밑천 떨어지는걸 
느끼겠지…
앞서 본 것처럼 LPVOID 값에 맞는 경우 TLS슬롯에 데이터를 직접 저장할 수 있습니다 
그러나 대규모의 인덱스를 사용한다면, 
별도의 저장 영역을 만들어서 통합하고, TLS 사용 슬롯은 최소화 하는게 좋습니다 
포인터를 통해 TLS 블록에 접근되기 때문에, 아무래도 stack에 저장된 것보다는 느리겠죠 
Optimizing software in C++에서 그렇다고 합니다 
http://www.agner.org/optimize/optimizing_cpp.pdf 
슬슬 이거 적는 것도 
귀찮아 지고 있어…
“용과 같이 – 유신”에서는 TLS을 이용해 쉐이더를 최적화 했습니다 
구체적인 내용은 모르지만, 쉐이더별로 다른 설정들을 특별한 스위칭 없이 사용한게 아닌가… 
device_context니까 그렇겠지…하고 있습니다 
사실 이 사례는 PS3를 빠르게 PS4로 바꾸는 과정에서 나온 이야기라 범용적이진 않겠지만… 
DX9 라이브에서 DX11로 빠른 수정을 하겠다! 라면 참고해 볼만하지 않을까 싶기도 하고요 
어떻게 활용을 할 수 있을지는 모두의 마음속에… 
뭐 전부 틀리고 
망상이라도 
그건 자유니까요…
내용상의 오류나 전수할 노하우가 있으시다면 
quetionname@naver.com 으로 알려주세요 
http://cafe.naver.com/devrookie 에 와서 알려주신다면 더욱 좋습니다! 
감사합니다! 
모르는게 없는 
그날 까지… 
는 못합니다

Mais conteúdo relacionado

Destaque

Do The Right Thing! How LDAP servers should help LDAP clients
Do The Right Thing! How LDAP servers should help LDAP clientsDo The Right Thing! How LDAP servers should help LDAP clients
Do The Right Thing! How LDAP servers should help LDAP clientsLDAPCon
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터Hoyoung Jung
 
포인터의 공식
포인터의 공식포인터의 공식
포인터의 공식Hoyoung Jung
 
포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1Hoyoung Jung
 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object poolingNam Hyeonuk
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVAcooddy
 
네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)MoonLightMS
 
[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?용민 박
 
뇌자T 1.네트워크와 tcpip
뇌자T   1.네트워크와 tcpip뇌자T   1.네트워크와 tcpip
뇌자T 1.네트워크와 tcpipsj k
 
포인터의 기초(1)
포인터의 기초(1)포인터의 기초(1)
포인터의 기초(1)Hoyoung Jung
 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15Nam Hyeonuk
 
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략KTH, 케이티하이텔
 
Java programming language
Java programming languageJava programming language
Java programming languageChiwon Song
 
[2013 CodeEngn Conference 09] x15kangx - MS Office 2010 문서 암호화 방식 분석 결과
[2013 CodeEngn Conference 09] x15kangx - MS Office 2010 문서 암호화 방식 분석 결과[2013 CodeEngn Conference 09] x15kangx - MS Office 2010 문서 암호화 방식 분석 결과
[2013 CodeEngn Conference 09] x15kangx - MS Office 2010 문서 암호화 방식 분석 결과GangSeok Lee
 
웹 서비스를 위한 보안서버 구축방향
웹 서비스를 위한 보안서버 구축방향웹 서비스를 위한 보안서버 구축방향
웹 서비스를 위한 보안서버 구축방향FlyHigh Co., LTD.
 
[2008 CodeEngn Conference 02] graylynx - 정적 링크된 Stripped ELF 바이너리 상에서의 함수 탐지 기법
[2008 CodeEngn Conference 02] graylynx - 정적 링크된 Stripped ELF 바이너리 상에서의 함수 탐지 기법[2008 CodeEngn Conference 02] graylynx - 정적 링크된 Stripped ELF 바이너리 상에서의 함수 탐지 기법
[2008 CodeEngn Conference 02] graylynx - 정적 링크된 Stripped ELF 바이너리 상에서의 함수 탐지 기법GangSeok Lee
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io modelNam Hyeonuk
 

Destaque (20)

Multi thread
Multi threadMulti thread
Multi thread
 
Do The Right Thing! How LDAP servers should help LDAP clients
Do The Right Thing! How LDAP servers should help LDAP clientsDo The Right Thing! How LDAP servers should help LDAP clients
Do The Right Thing! How LDAP servers should help LDAP clients
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
 
포인터의 공식
포인터의 공식포인터의 공식
포인터의 공식
 
포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1
 
3.포인터
3.포인터3.포인터
3.포인터
 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object pooling
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
 
Database
DatabaseDatabase
Database
 
네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)
 
[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?
 
뇌자T 1.네트워크와 tcpip
뇌자T   1.네트워크와 tcpip뇌자T   1.네트워크와 tcpip
뇌자T 1.네트워크와 tcpip
 
포인터의 기초(1)
포인터의 기초(1)포인터의 기초(1)
포인터의 기초(1)
 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
 
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
 
Java programming language
Java programming languageJava programming language
Java programming language
 
[2013 CodeEngn Conference 09] x15kangx - MS Office 2010 문서 암호화 방식 분석 결과
[2013 CodeEngn Conference 09] x15kangx - MS Office 2010 문서 암호화 방식 분석 결과[2013 CodeEngn Conference 09] x15kangx - MS Office 2010 문서 암호화 방식 분석 결과
[2013 CodeEngn Conference 09] x15kangx - MS Office 2010 문서 암호화 방식 분석 결과
 
웹 서비스를 위한 보안서버 구축방향
웹 서비스를 위한 보안서버 구축방향웹 서비스를 위한 보안서버 구축방향
웹 서비스를 위한 보안서버 구축방향
 
[2008 CodeEngn Conference 02] graylynx - 정적 링크된 Stripped ELF 바이너리 상에서의 함수 탐지 기법
[2008 CodeEngn Conference 02] graylynx - 정적 링크된 Stripped ELF 바이너리 상에서의 함수 탐지 기법[2008 CodeEngn Conference 02] graylynx - 정적 링크된 Stripped ELF 바이너리 상에서의 함수 탐지 기법
[2008 CodeEngn Conference 02] graylynx - 정적 링크된 Stripped ELF 바이너리 상에서의 함수 탐지 기법
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
 

Semelhante a [14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)

Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsRyan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsSuwon Chae
 
MSA와 infra
MSA와 infraMSA와 infra
MSA와 infraJe Hun Kim
 
Windows reversing study_basic_9
Windows reversing study_basic_9Windows reversing study_basic_9
Windows reversing study_basic_9Jinkyoung Kim
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 APINAVER Engineering
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈Seo YoungHoon
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇Seungyong Lee
 
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기NAVER D2
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기Tae Young Lee
 
이것이 리눅스다 - 김종욱
이것이 리눅스다 - 김종욱이것이 리눅스다 - 김종욱
이것이 리눅스다 - 김종욱Jong Wook Kim
 
[NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 [NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 YoungSu Son
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여iamprogrammerofficial
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기KwangSeob Jeong
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQLI Goo Lee
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임codenavy
 

Semelhante a [14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie) (20)

Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsRyan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
 
MSA와 infra
MSA와 infraMSA와 infra
MSA와 infra
 
llvm 소개
llvm 소개llvm 소개
llvm 소개
 
Windows reversing study_basic_9
Windows reversing study_basic_9Windows reversing study_basic_9
Windows reversing study_basic_9
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇
 
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기
 
ice_grad
ice_gradice_grad
ice_grad
 
이것이 리눅스다 - 김종욱
이것이 리눅스다 - 김종욱이것이 리눅스다 - 김종욱
이것이 리눅스다 - 김종욱
 
[NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 [NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQL
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임
 

Mais de 해강

[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self해강
 
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie해강
 
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...해강
 
[14.12.27] 종횡사해2014(DevRookie)
[14.12.27] 종횡사해2014(DevRookie)[14.12.27] 종횡사해2014(DevRookie)
[14.12.27] 종횡사해2014(DevRookie)해강
 
[14.12.08] 행렬대수(ShaderStudy)
[14.12.08] 행렬대수(ShaderStudy)[14.12.08] 행렬대수(ShaderStudy)
[14.12.08] 행렬대수(ShaderStudy)해강
 
[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)해강
 
[14.10.10] TressFX 번역(self)
[14.10.10] TressFX 번역(self)[14.10.10] TressFX 번역(self)
[14.10.10] TressFX 번역(self)해강
 
[14.09.01] dynamic lighting in god of war3(shader study)
[14.09.01] dynamic lighting in god of war3(shader study)[14.09.01] dynamic lighting in god of war3(shader study)
[14.09.01] dynamic lighting in god of war3(shader study)해강
 
[14.06.28] 이 구역의 프로그래머는 나야(devrookie - 공개용)
[14.06.28]  이 구역의 프로그래머는 나야(devrookie - 공개용)[14.06.28]  이 구역의 프로그래머는 나야(devrookie - 공개용)
[14.06.28] 이 구역의 프로그래머는 나야(devrookie - 공개용)해강
 
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)해강
 
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)해강
 
[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)해강
 
[Dev rookie] Omnibus Me (2014.01.11)
[Dev rookie] Omnibus Me (2014.01.11)[Dev rookie] Omnibus Me (2014.01.11)
[Dev rookie] Omnibus Me (2014.01.11)해강
 
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)해강
 
[Dev rookie]사망유희2013(13.12.21)
[Dev rookie]사망유희2013(13.12.21)[Dev rookie]사망유희2013(13.12.21)
[Dev rookie]사망유희2013(13.12.21)해강
 
[Dev rookie] 이상적인 게임에 관하여(13.11.30)
[Dev rookie] 이상적인 게임에 관하여(13.11.30)[Dev rookie] 이상적인 게임에 관하여(13.11.30)
[Dev rookie] 이상적인 게임에 관하여(13.11.30)해강
 
[Dev rookie] 어디로 가야 하나요(13.10.05)
[Dev rookie] 어디로 가야 하나요(13.10.05)[Dev rookie] 어디로 가야 하나요(13.10.05)
[Dev rookie] 어디로 가야 하나요(13.10.05)해강
 
[Softmax] 유익한 무엇에 관하여(13.09.27)
[Softmax] 유익한 무엇에 관하여(13.09.27)[Softmax] 유익한 무엇에 관하여(13.09.27)
[Softmax] 유익한 무엇에 관하여(13.09.27)해강
 
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)해강
 
[Dev rookie] 예술하고 싶어요(13.06.29)
[Dev rookie] 예술하고 싶어요(13.06.29)[Dev rookie] 예술하고 싶어요(13.06.29)
[Dev rookie] 예술하고 싶어요(13.06.29)해강
 

Mais de 해강 (20)

[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
 
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
 
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
 
[14.12.27] 종횡사해2014(DevRookie)
[14.12.27] 종횡사해2014(DevRookie)[14.12.27] 종횡사해2014(DevRookie)
[14.12.27] 종횡사해2014(DevRookie)
 
[14.12.08] 행렬대수(ShaderStudy)
[14.12.08] 행렬대수(ShaderStudy)[14.12.08] 행렬대수(ShaderStudy)
[14.12.08] 행렬대수(ShaderStudy)
 
[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)
 
[14.10.10] TressFX 번역(self)
[14.10.10] TressFX 번역(self)[14.10.10] TressFX 번역(self)
[14.10.10] TressFX 번역(self)
 
[14.09.01] dynamic lighting in god of war3(shader study)
[14.09.01] dynamic lighting in god of war3(shader study)[14.09.01] dynamic lighting in god of war3(shader study)
[14.09.01] dynamic lighting in god of war3(shader study)
 
[14.06.28] 이 구역의 프로그래머는 나야(devrookie - 공개용)
[14.06.28]  이 구역의 프로그래머는 나야(devrookie - 공개용)[14.06.28]  이 구역의 프로그래머는 나야(devrookie - 공개용)
[14.06.28] 이 구역의 프로그래머는 나야(devrookie - 공개용)
 
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
 
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
 
[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)
 
[Dev rookie] Omnibus Me (2014.01.11)
[Dev rookie] Omnibus Me (2014.01.11)[Dev rookie] Omnibus Me (2014.01.11)
[Dev rookie] Omnibus Me (2014.01.11)
 
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
 
[Dev rookie]사망유희2013(13.12.21)
[Dev rookie]사망유희2013(13.12.21)[Dev rookie]사망유희2013(13.12.21)
[Dev rookie]사망유희2013(13.12.21)
 
[Dev rookie] 이상적인 게임에 관하여(13.11.30)
[Dev rookie] 이상적인 게임에 관하여(13.11.30)[Dev rookie] 이상적인 게임에 관하여(13.11.30)
[Dev rookie] 이상적인 게임에 관하여(13.11.30)
 
[Dev rookie] 어디로 가야 하나요(13.10.05)
[Dev rookie] 어디로 가야 하나요(13.10.05)[Dev rookie] 어디로 가야 하나요(13.10.05)
[Dev rookie] 어디로 가야 하나요(13.10.05)
 
[Softmax] 유익한 무엇에 관하여(13.09.27)
[Softmax] 유익한 무엇에 관하여(13.09.27)[Softmax] 유익한 무엇에 관하여(13.09.27)
[Softmax] 유익한 무엇에 관하여(13.09.27)
 
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
 
[Dev rookie] 예술하고 싶어요(13.06.29)
[Dev rookie] 예술하고 싶어요(13.06.29)[Dev rookie] 예술하고 싶어요(13.06.29)
[Dev rookie] 예술하고 싶어요(13.06.29)
 

[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)

  • 1. 아! 그거... 모르겠습니다 - TLS 해강입니다…
  • 2. TLS는 Thread Local Storage의 약자입니다 “용과 같이 – 유신”에서 최적화 기법(http://www.slideshare.net/agebreak/141004-cedec-2014-1)으로 사용했다는데 뭔지 몰라서 기록해둡니다 멀티스레드에서 사용되는 용어이고, 아래를 참고했습니다 MSDN : http://msdn.microsoft.com/en-us/library/ms686749.aspx WIKI : http://en.wikipedia.org/wiki/Thread-local_storage 지역 저장 잘 하게 생겼네…
  • 3. 기본적으로 프로세스의 모든 스레드는 가상 주소 공간을 공유합니다 때문에 함수 안의 로컬 변수야 스레드 각각 쓰지만, static 변수나 전역 변수는 공유됩니다 보통 이런거 접근 순서 때문에 엉뚱한 값이 되거나 DeadLock이니 뭐니 문제 만들게 되죠 그러나 TLS를 사용하면 프로세스가 글로벌 인덱스를 사용하여, 각각의 스레드마다 고유의 데이터를 제공합니다 하나의 스레드안에 다른 스레드들이 특별히 이용할 수 있는 인덱스를 만들어 놓는거죠 자기 몫은 자기가 챙겨라 이거지….
  • 4. TLS가 작동하는 구조는 아래 그림과 같습니다 똑같은 gdwTIsIndex2에 접근하는데 Thread1은 메모리5에, Thread2는 메모리2에 접근하죠 TLS Index를 통해 TLS 슬롯의 메모리 블록에 접근, 각각의 lpvData값을 얻는 겁니다 다시 말해, TLS는 스레드마다 포인터를 지정, 각각의 메모리 블록에 접근할 수 있게 해줍니다 따라서 전역 데이터가 아닌, 서로 다른 블록의 데이터를 사용하게 되는 거죠 Virtual table을 통한 지역변수화 정도로 이해하면 될 것 같습니다 당신과 내가 똑같다고 생각하면 곤란해란 느낌…
  • 5. TLS를 사용하기 위해서는 변수 선언 앞에 지정된 키워드를 적어주면 됩니다 __declspec( thread ) int number; 비주얼C++ 컴파일러 기준으로 제공되는 키워드입니다 컴파일러에 따라 __thread라는 키워드를 지원하기도 합니다 간단하지만 위와 같은 방법은 정적으로 선언하는 것이라 런타임중 로드한 dll같은 경우 메모리 블록을 제대로 잡지 못 하는 문제가 발생할 수 있어 추천되지는 않습니다 쉬운 길에는 언제나 함정이 있지….
  • 6. 동적으로 사용하기 위해서 제공되는 API는 다음과 같습니다 가능한 API를 사용하라고 권장하고 있습니다 DWORD TlsAlloc( void ); // Index 할당 BOOL TlsSetValue( DWORD dwTlsIndex, LPVOID lpTlsValue ); // 데이터 저장 LPVOID TlsGetValue( DWORD dwTlsIndex ); // 데이터 읽기 BOOL TlsFree( DWORD dwTlsIndex); // 해제 기껏 만들어줘도 안 쓰는 사람들이 있을지도 모르지….
  • 7. 간략한 코드로 보자면 이런 느낌이죠 DWORD dwTlsIndex; LPVOID lpvData; // Index를 할당해주고 if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) ErrorExit("TlsAlloc failed"); // 데이터를 저장해준 뒤 if (! TlsSetValue(dwTlsIndex, lpvData)) ErrorExit("TlsSetValue error"); // 현재 스레드에 대한 데이터 포인트 검색해 읽고 lpvData = TlsGetValue(dwTlsIndex); // 마지막에는 꼭 해제해줍니다 TlsFree(dwTlsIndex); 적절히 잘 쓰는건 다음 문제지만….
  • 8. 몇 가지만 더 살펴보겠습니다 앞에 소스에 할당할 때 나온 TLS_OUT_OF_INDEXES는 아래와 같이 정의되어 있습니다 #define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) 그외에 TLS_MINIMUM_AVAILABLE에는 각 프로세스에서 사용할 TLS 인덱스의 최소수가 정의되어 있습니다 시스템에 따라 최소 64 ~ 최대 1088의 인덱스를 사용할 수 있습니다 모른다고 크게 문제될 것도 없지만서도….
  • 9. 스레드가 생성될 때, 시스템은 LPVOID값의 배열을 할당하고 NULL값으로 초기화합니다 인덱스를 사용하기 전에 먼저 할당하는 것을 꼭 잊지 마세요 내부적으로 프로세스, 스레드의 진입/해제를 위해 DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH, DLL_PROCESS_DETACH를 호출합니다 winnt.h 에 대부분 정의되어 있습니다 보는 사람도 이제 밑천 떨어지는걸 느끼겠지…
  • 10. 앞서 본 것처럼 LPVOID 값에 맞는 경우 TLS슬롯에 데이터를 직접 저장할 수 있습니다 그러나 대규모의 인덱스를 사용한다면, 별도의 저장 영역을 만들어서 통합하고, TLS 사용 슬롯은 최소화 하는게 좋습니다 포인터를 통해 TLS 블록에 접근되기 때문에, 아무래도 stack에 저장된 것보다는 느리겠죠 Optimizing software in C++에서 그렇다고 합니다 http://www.agner.org/optimize/optimizing_cpp.pdf 슬슬 이거 적는 것도 귀찮아 지고 있어…
  • 11. “용과 같이 – 유신”에서는 TLS을 이용해 쉐이더를 최적화 했습니다 구체적인 내용은 모르지만, 쉐이더별로 다른 설정들을 특별한 스위칭 없이 사용한게 아닌가… device_context니까 그렇겠지…하고 있습니다 사실 이 사례는 PS3를 빠르게 PS4로 바꾸는 과정에서 나온 이야기라 범용적이진 않겠지만… DX9 라이브에서 DX11로 빠른 수정을 하겠다! 라면 참고해 볼만하지 않을까 싶기도 하고요 어떻게 활용을 할 수 있을지는 모두의 마음속에… 뭐 전부 틀리고 망상이라도 그건 자유니까요…
  • 12. 내용상의 오류나 전수할 노하우가 있으시다면 quetionname@naver.com 으로 알려주세요 http://cafe.naver.com/devrookie 에 와서 알려주신다면 더욱 좋습니다! 감사합니다! 모르는게 없는 그날 까지… 는 못합니다