Heap힙 /ptmalloc
ptmalloc2 allocator
ptmalloc2란?
리눅스 GLIBC에서 사용하는 메모리 할당자임. 리눅스 유저모드에서 주로 사용함.
chunk가 뭐임...
메모리 관리 시스템에서 메모리의 기본 할당 단위.
memory allocator가 관리하는 메모리 블록의 단위라고 생각하면됨.
chunk는 allocated (사용중인 영역 )/ free (해제되서 재사용 가능한 영역) 두가지 상태로 나뉜다.
free chuck들은 bin이라는 자료구조에 의해서 크기별로 관리되고 , free list형태로 구성됨.
allocated chunk 와 free chunk
prev_size: 이전 힙 청크가 해제되었을 경우 해제된 힙 청크의 크기 저장.
size: 할당된 현재 힙 청크의 크기를 저장하고 있고, 3개의 비트 플래그 존재.
- flags(3bit)
- PREV_INUSE (P): 이전 청크가 할당된 경우 설정됨.
- IS_MMAPPED (M): 현재 청크가 mmap 시스템 콜을 통해 할당된 경우 설정됨.
- NON_MAIN_ARENA (N) : 현재 청크가 thread arena에 위치하는 경우 설정됨.
prev_size : 두 개의 빈 청크는 서로 인접할 수 없음.
size: 이 필드에는 빈 청크의 크기가 포함된다.
fd(Forward Pointer): 같은 bin에 있는 다음 청크를 가리킴
bk(Backward Pointer): 같은 bin에 있는 이전 free 청크를 가리킴
bin이 뭐임?
free chunk를 관리하는데 사용하는 자료구조. 청크의 크기를 기준으로 사용가능한 bin이 달라짐.
freelist?
할당되지 않은 메모리 블록들을 관리함. free된 청크들의 list.
영역을 해제하면 freelist에 해제하려는 영역이 추가되고, 할당할 땐 freelist의 가장 끝 영역을 제거하고 그 영역을 사용함.
bin은 이러한 free list를 크기별로 분류해서 관리하게 됨.
이렇게 관리함으로써 , 메모리 할당 요청이 들어왔을 때 적절한 크기의 bin을 바로 찾아서 그 bin의 free list에서 적합한 메모리 블록을 찾음.
ptmalloc에서 사용하는 bin 종류
Fast bins: 작은 크기의 chunk를 빠르게 할당하기 위한 bin. LIFO 단일 연결 리스트 구조. 병합 x
16~64바이트 (32bit)
32~128바이트 (64bit)
Small bins: 작은~ 중간 크기의 chunk를 관리. FIFO 이중 연결 리스트 구조
청크크기 < 512바이트 (32bit)
청크 크기 < 1024바이트 (64bit)
Large bins: 큰 크기의 chunck 관리. 이중 연결 리스트 구조. 크기별로 내림차순 정렬
size of user data >= 512바이트 (32bit)
size of user data >= 1024바이트 (64bit)
Unsorted bin: 메모리 할당 효율성 향상. FIFO 이중 연결 리스트 구조.
해제된 chunk는 즉시 해당 크기의 bin으로 분류되지 않고 먼저 unsorted bin에 배치.
https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/