1. fastbin
M_MXFAST
매개변수를 사용하여 청크의 범위를 설정한다. (1이면 사용, 0이면 fastbin을 사용하지 않음)- default 범위는
0~80*(size_t)/4
까지 - 일반적으로 사용하는 범위는
0 ~ 64*(size_t)/4
- 32bit에서는
size_t
가 4, 64bit에서는 8 - 따라서 fastbin의 상한은 32bit에서는
64byte(0x40)
, 64bit에서는128byte(0x80)
- LIFO (Last In First Out) 방식을 채택, 즉 마지막으로 해제된 chunk를 먼저 재사용한다.
- fastbin에서 서로 chunk가 인접해 있어도 병합하지 않는다.
2. smallbin
MIN_LARGE_SIZE
보다 작은 값을 사용 : 32bit에서는512(0x200)
, 64bit에서는1024(0x400)
- 32bit 시스템에서 smallbin의 범위는
0x10~(0x200-8)
, 64bit에서는0x20~(0x400-0x10)
- 총 64개의 bin을 관리하며, doubly-linked list로 구성되어 있음. (FD, BK)
- 같은 크기의 chunk가 해제되면 원래 smallbin에 마지막으로 남아있던 chunk의 FD에 새로 해제된 chunk의 주소를 넣는다.
- FIFO (First In First Out) 방식을 채택, 처음에 free된 chunk를 먼저 재사용한다.
- bin에서 chunk가 서로 인접해 있을 경우 병합 과정을 거친다(malloc_consolidate). 따라서 서로 붙어있을 수 없다.
3. largebin
MIN_LARGE_SIZE <= Large_Bin_Range
- 64bit의 경우에 chunk의 크기가
1024byte
이상이면 Largebin에 배치 - Largebin도 smallbin과 마찬가지로 bin에서 chunk가 서로 인접할 경우 하나의 chunk로 병합
- 63개의 bin을 사용, doubly-linked list로 구성. FIFO 방식.
- 그러나, 하나의 bin에 다양한 크기의 chunk를 넣을 수 있다는 것이 smallbin과의 차이점.
- bin 내에서는 내부적으로 크기별로 정렬되어 있지만 free된 순서대로 FD, BK를 통해 연결되어 있음.
4. unsorted bin
- fastbin을 제외한 smallbin, largebin 크기의 chunk를 free했을 경우 먼저 배치가 되는 곳
- unsorted bin에 있는 chunk와 같은 크기의 chunk를 할당할 때 unsorted bin에 있는 그 chunk를 재할당
- FIFO(First In First Out) 방식
- unsorted bin에 있는 chunk는 재할당되거나 smallbin이나 largebin에 배치된다.
※ 그 이외의 128KB 이상의 메모리는 bin에 속하지 않고, IS_MMAPPED 플래그가 설정된다.
(size의 flag값에 0x2 & 연산)