malloc_chunk
이 구조체는 특정한 메모리의 청크를 나타낸다. 할당 / 비할당 청크에 따라 각각의 필드는 다른 의미를 가진다.
1 2 3 4 5 6 7 8 9 10 11 | struct malloc_chunk { INTERNAL_SIZE_T mchunk_prev_size; /* Size of previous chunk (if free). */ INTERNAL_SIZE_T mchunk_size; /* Size in bytes, including overhead. */ struct malloc_chunk* fd; /* double links -- used only if free. */ struct malloc_chunk* bk; /* Only used for large blocks: pointer to next larger size. */ struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */ struct malloc_chunk* bk_nextsize; }; typedef struct malloc_chunk* mchunkptr; | cs |
A (NON_MAIN_ARENA) :멀티스레드에 경우 각 스레드마다 다른 heap 영역을 사용할 수 있기 때문에 현재 chunk가 아레나에 속하는지
M (IS_MMAPPED) : mmap() 시스템 콜을 통해 할당 되었는지를 나타내는 플래그
P (PREV_INUSE) : 이전 청크의 사용 유무를 나타내는 플래그 0일때 free
참고 : 패스트빈의 청크는 인접한 free된 청크와 통합되지 않는다는 점에서 할당 된 청크로 처리된다.
small_bin이라면 fd_nextsize, bk_nextsize의 영역은 필요없다. large bin만 가지고 있는 구조체의 값들이다.
Allocated chunk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk, if unallocated (P clear) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of chunk, in bytes |A|M|P| mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | User data starts here... . . . . (malloc_usable_size() bytes) . . | nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | (size of chunk, but used for application data) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of next chunk, in bytes |A|0|1| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | cs |
청크(자기자신)가 free되면 user data영역이 fd, bk로 사용된다.
이전 청크가 free상태가 아니라면 prev_size는 data영역으로 사용된다.
Free chunk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk, if unallocated (P clear) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `head:' | Size of chunk, in bytes |A|0|P| mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Forward pointer to next chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Back pointer to previous chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Unused space (may be 0 bytes long) . . . . | nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `foot:' | Size of chunk, in bytes | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of next chunk, in bytes |A|0|0| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | cs |
'Heap' 카테고리의 다른 글
06.malloc 분석 (0) | 2018.06.05 |
---|---|
05.Internal functions (0) | 2018.06.01 |
04.Bins and Chunks (0) | 2018.05.24 |
03.malloc_state (0) | 2018.05.24 |
01.Understanding glibc malloc (0) | 2018.05.21 |