Why should I know this?

Linux Thread Local Storage 공부 및 적용 본문

Knowledge/Architecture

Linux Thread Local Storage 공부 및 적용

die4taoam 2022. 12. 19. 05:37

과거  Linux에서 사용할 수 있는 Thread Local Storage 종류와 차이를 다룬 적이 있다.

 

https://die4taoam.tistory.com/37

 

Linux의 thread local storage 파헤치기

Thread Local Storage 파헤치기 0. 개요Thread Local Storage는 Multi-Thread 프로그램을 작성하는데 거의 필수로 사용되는 기능이다.Linux에서의 Thread Local Storage에 대하 자세히 다뤄보고자 한다. 이 글에서 다루

die4taoam.tistory.com

Linux TLS 에 대한 설명은 링크에 있다.

Linux TLS 를 공부하게 된 이유는 Nodejs Tracing 기능을 Uftrace에 넣기 위한 시도 중에 재귀호출이 확인되서 였는데, Uftrace가 과거 사용했던 __thread 로 시작되는 local/global dynamic 이 내부적으로 호출하는 함수 때문에 생기는 문제였다.

 

    struct tls *test = &find_me;

    # 201fe0 <find_me@@Base+0x201fe0>

    166a:       66 48 8d 3d 6e 09 20    data16 lea 0x20096e(%rip),%rdi       

    1671:       00

    1672:       66 66 48 e8 76 f7 ff    data16 data16 callq df0 <__tls_get_addr@plt>

    1679:       ff

 

여기서 호출하는 __tls_get_addr 이라는 함수가 Uftrace가 재귀호출하게 만드는 함수였다. 문제 원인 파악 및 해결책을 강구하는 과정에서 과거 POSIX 스타일의 표준함수가 아닌 Linux의 TLS 모델을 제안한 문서를 접하게 되었고 여기서 영감을 얻어 initial-exec 타입으로 TLS 변수를 변경하게 되었던 것이다.

 

해당 문서는 다음 링크를 참고하길 바란다.

https://www.fsfla.org/~lxoliva/writeups/TLS/RFC-TLSDESC-x86.txt

 

initial-exec로 선언된 TLS 변수는 링크된 글에서 나오듯 다음처럼 번역되고 별도의 함수호출이 필요없다.

 

mov 0x2d6a6 (% rip),% rax # 35fc8 <.got + 0x38>
mov% fs: (% rax),% rbx

 

 

이 스터디를 진행한 이유가 됐던 기능은 아직 병합하지 못했다.
하지만 어쨌든 공부했던게 헛된 일은 아니다.

공부했던 내용과 관련 커밋만 추려서 병합 요청하면 되기 때문~

 

https://github.com/ParkHanbum/uftrace/commit/8851fa68066ca2ae3017508aef6d0e1e9c607ba9

 

mcount: Change TLS type to initial-exec · ParkHanbum/uftrace@8851fa6

-. Benefit changed the model of the TLS variable mtd to initial-exec. The initial-exec model doesn't ocurred problem because it is not make any calls to refer the TLS. the way to refer to varia...

github.com

 

Linux에서 POSIX 타입 TLS 를 사용할 때의 성능차이는 공부 글 막바지에 포함되어 있지만,

별개로 Uftrace에서의 테스트 결과를 첨부한다 .

대략 240개 정도의 포본에서 표준편차 제외 233개 항목 대상.

- 평균 8.98ms 의 실행시간 단축.

- 약 7.2% 정도의 성능 향상

(표준편차 이렇게 적용하는게 맞긴 맞는걸까요...?  _-)

 

내가 원하는 기능을 구현하기 위해 어쩔 수 없이 공부해야 했던 것도 가끔은 이렇게 도움이 될 수 있다랄까?

제 블로그 표어 값 하는 글을 자주 쓸 수 있었으면 좋겠네요.

 

 

'Knowledge > Architecture' 카테고리의 다른 글

Memory Barrier for self-modifying code  (0) 2020.01.19
Comments