포너블

포너블/Heap

Tcache function

이번에는 Ubuntu GLIBC 2.27-3ubuntu1.2 기준 Tcache에 관한 함수들을 설명하겠다. tcache_entry typedef struct tcache_entry { struct tcache_entry *next; } tcache_entry; tcache chunk의 list를 만드는 요소이다. next 포인터로 연결리스트를 관리한다. tcache_perthread_struct typedef struct tcache_perthread_struct { char counts[TCACHE_MAX_BINS]; tcache_entry *entries[TCACHE_MAX_BINS]; } tcache_perthread_struct; tcache_entry를 관리하기 위해 사용된다. 2.26이전 버전..

포너블/Heap

Tcache

tcache란? thread local cache는 멀티 스레드 환경에서 메모리 할당 속도를 높이기 위한 것으로 각 스레드에 독립적으로 할당되는 캐시 저장소이다. 작은 단위의 메모리는 arena를 참조하지 않고 바로 메모리를 할당한다. tcache는 glibc 버전 2.26에서 도입되었으며, 멀티 스레드 환경에 더욱 최적화된 메모리 관리 메커니즘을 제공한다. tcache의 특징 - 각 스레드는 64개의 tcache를 가지고 있다. - tcache는 LIFO방식으로 사용되는 단일 연결리스트이며, 하나의 tcache는 같은 크기의 chunk들만 보관한다. - 리눅스는 각 tcache에 보관할 수 있는 chunk의 갯수를 7개로 제한하고 있다. - tcache에 들어간 chunk들은 병합되지 않는다. - tc..

포너블/Heap

free 소스코드 분석(libc 2.27)

libc 2.23을 기준으로 변경된 부분만 분석하겠다. https://k0n9.tistory.com/entry/free-%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C-%EB%B6%84%EC%84%9Dlibc-223 libc 2.26부터는 tcache의 개념이 도입되었다. 그러니 tcache 위주로 보자. tcache에 관한 함수는 곧 따로 정리하겠다.(tcache_get 등) __libc_free //__libc_free 2.27 void __libc_free (void *mem) { mstate ar_ptr; mchunkptr p; /* chunk corresponding to mem */ void (*hook) (void *, const void *) = atomic_forced_..

포너블/Heap

malloc 소스코드 분석(libc 2.27)

libc 2.23을 기준으로 변경된 부분만 분석하겠다. https://k0n9.tistory.com/entry/malloc-%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C-%EB%B6%84%EC%84%9Dlibc-223 libc 2.26부터는 tcache의 개념이 도입되었다. 그러니 tcache 위주로 보자. tcache에 관한 함수는 곧 따로 정리하겠다.(tcache_get 등) __libc_malloc 아래는 malloc함수 호출시 실행되는 코드이다. //__libc_malloc 2.27 void * __libc_malloc (size_t bytes) { mstate ar_ptr; void *victim; void *(*hook) (size_t, const void *) = atom..

포너블/Heap

free 소스코드 분석(libc 2.23)

linking과정은 https://k0n9.tistory.com/entry/heap%EC%9D%98-%EA%B0%9C%EB%85%90-4 에 나오는 그림을 참고하면 좋다. __libc_free 아래는 free함수 호출시 실행되는 코드이다. //__libc_free 2.23 void __libc_free (void *mem) { mstate ar_ptr; mchunkptr p; /* chunk corresponding to mem */ void (*hook) (void *, const void *) = atomic_forced_read (__free_hook); if (__builtin_expect (hook != NULL, 0)) { (*hook)(mem, RETURN_ADDRESS (0)); retur..

포너블/Heap

malloc 소스코드 분석(libc 2.23)

linking과정은 https://k0n9.tistory.com/entry/heap%EC%9D%98-%EA%B0%9C%EB%85%90-4 에 나오는 그림을 참고하면 좋다. __libc_malloc 아래는 malloc함수 호출시 실행되는 코드이다. //__libc_malloc 2.23 void * __libc_malloc (size_t bytes) { mstate ar_ptr; void *victim; void *(*hook) (size_t, const void *) = atomic_forced_read (__malloc_hook); if (__builtin_expect (hook != NULL, 0)) return (*hook)(bytes, RETURN_ADDRESS (0)); arena_get (ar_..

포너블/Heap

heap의 개념-(4)

원래는 arena에 대한 설명만 하려 했는데 이 부분이 빠진 것 같아서 끼워넣기를 했다...heap 영역이 할당되는 과정기본적으로 malloc 등의 함수를 사용하지 않아도 132KB 크기의 initial heap이 존재한다. 그리고 할당 가능한 요구가 들어오면 heap segment를 확장한다. 여기서 확장하는 것을 sbrk()라고 한다.start_brk : 프로그램 초기 heap 주소를 나타내는 변수break location : heap의 끝 주소brk() : 프로세스의 heap 끝 주소를 설정하는데 사용된다. 프로세스가 런타임 중에 메모리를 필요로 할 때마다 break location을 조정하여 힙의 크기를 증가시키거나 감소시킨다. sbrk() : brk와 비슷한 역할을 하는데 brk와 차이점으로는 ..

포너블/Heap

heap의 개념-(3)

Boundary Tag chunk가 할당 될 때는 해당 chunk의 크기 정보가 해당 chunk의 size에 저장이 된다. chunk가 해제 될 때는 해당 chunk의 크기 정보가 다음 chunk의 prev_size에 저장이 된다. 이러한 정보로 우리는 인접한 앞/뒤 chunk의 주소 계산이 가능하다. 인접한 다음 chunk의 주소 chunk(A)를 기준으로 chunk_addr(A) + size(A) = chunk_addr(B) 가 된다. 이를 통해 다음 chunk의 주소를 알 수 있다. 인접한 앞의 chunk가 free된 경우의 freed chunk의 주소 chunk(B)를 기준으로 chunk(A)가 해제되었다면 chunk(B)의 prev_size가 초기화 된다. 그래서 chunk_addr(B) - p..

K0n9
'포너블' 카테고리의 글 목록 (6 Page)