Heap

Heap 기초(3) - ptmalloc의 bin_2 (arena, tcache)

LikeMermaid 2022. 10. 24. 04:25
728x90

arena

arena는 fastbin, smallbin, largebin 등의 정보를 모두 담고있는 객체

레이스 컨디션을 막기 위해 arena에 접근할 때 arena에 락을 적용함

arena는 병목 현상을 최대한 피하기 위해 64개의 arena를 생성할 수 있으며 arena에 락이 걸려서 대기해야 하는 경우 새로운 arena를 생성하여 이를 피함. 하지만 생성할 수 있는 갯수가 64개로 제한되어 있어 과도한 멀티 쓰레드 환경에서는 결국 병목 현상이 발생함


tcache (thread local cache)

각 쓰레드의 독립적으로 할당되는 캐시 저장소를 지칭하며 GLibc 2.26 버전부터 도입되어 멀티 쓰레드 환경에 더욱 최적화된 메모리 관리 메커니즘을 제공함

특징

- 각 쓰레드는 64개의 tcache를 가지고 있으며 tcache는 fastbin과 마찬가지로 LIFO(후입선출) 방식으로 사용되는 단일 연결리스트임
- 하나의 tache는 같은 크기의 청크들만 보관함
- tcache에 들어간 청크들은 병합되지 않음
※ 리눅스는 각 tcache에 보관할 수 있는 청크의 갯수를 7개로 제한하고 있는데, 이는 쓰레드마다 정의되는 tcache 특성상 무제한으청크를 연결할 수 있어 메모리가 낭비될 수 있기 때문

tcache에는 32바이트 이상 1040바이트 이하의 크기를 갖는 청크들이 보관되며 이 범위에 속하는 청크들은 할당 및 해제 시 tcache를 가장 먼저 조회함. tcache가 가득찼을 경우에는 적절한 bin으로 분류됨
tcache - 크기에 따라 적절한 bin에 분류

- tcache는 각 쓰레드가 고유하게 갖는 캐시라 레이스 컨디션을 고려하지 않고 이 캐시에 접근할 수 있음
- arena의 bin에 접근하기 전에 tcache를 먼저 사용하므로 arena에서 발생할 수 있는 병목 현상을 완화해줌

하지만 tcache는 보안 검사가 많이 생략되어 있어서 힙 익스플로잇 타겟으로 많이 사용됨