Heap

Heap 기초(2) - ptmalloc의 bin_1 (small, large, fast, unsorted)

LikeMermaid 2022. 10. 22. 04:23
728x90

bin 종류

사용이 끝난 청크들이 저장되는 객체로 메모리 낭비를 막고 해제된 청크를 빠르게 재사용할 수 있도록 해줌

ptmalloc 기준으로 총 128개가 정의되어 있음

smallbin(62개) - 32 바이트 이상 1024 바이트 미만의 크기를 갖는 청크들이 보관됨. 하나의 smallbin에는 같은 크기의 청크들만 보관되며 bin의 인덱스가 증가할 수록 16바이트씩 커짐

fastbin (10개) - 32 바이트 이상 176 바이트 이하 크기를 갖는 청크들이 보관됨. 16 바이트 단위로 총 10개의 fastbin이 존재하며 리눅스 기준으로 이 중에서 작은 크기부터 7개의 fastbin만 사용하여 결과적으로 32 바이트 이상 128 바이트 이하 청크들이 fastbin에 저장됨

largebin(63개) - 1024 바이트 이상 크기를 갖는 청크들이 보관됨. 일정 범위 안의 크기를 갖는 청크들이 모두 보관되며 bin의 인덱스가 증가할 수록 로그적으로 증가함

unsortedbin(1개) - 분류되지 않은 청크들을 보관하며 fastbin에 들어가지 않은 모든 청크들은 해제되었을 때 크기 구분 없이 unsortedbin에 보관됨

나머지 2개는 사용되지 않음


청크 할당 요청 시 bin 탐색 순서(ptmalloc)

smallbin 크기에 해당하는 청크 할당 요청
fasbin/smallbin - unsortedbin

largebin 크기에 해당하는 청크 할당 요청
unsortedbin - 크기에 따라 적절한 bin에 분류

largebin 크기에 해당하는 청크 할당 요청 시 연속적으로 청크를 해제하면서 병합하고 재분류하는 과정이 반복적으로 발생하는데 이러한 과정에서 생기는 비용을 줄이기 위해 unsortedbin을 먼저 탐색하여 비용을 절감함