전체 글 24

Heap 기초(3) - ptmalloc의 bin_2 (arena, tcache)

arena arena는 fastbin, smallbin, largebin 등의 정보를 모두 담고있는 객체 레이스 컨디션을 막기 위해 arena에 접근할 때 arena에 락을 적용함 arena는 병목 현상을 최대한 피하기 위해 64개의 arena를 생성할 수 있으며 arena에 락이 걸려서 대기해야 하는 경우 새로운 arena를 생성하여 이를 피함. 하지만 생성할 수 있는 갯수가 64개로 제한되어 있어 과도한 멀티 쓰레드 환경에서는 결국 병목 현상이 발생함 tcache (thread local cache) 각 쓰레드의 독립적으로 할당되는 캐시 저장소를 지칭하며 GLibc 2.26 버전부터 도입되어 멀티 쓰레드 환경에 더욱 최적화된 메모리 관리 메커니즘을 제공함 특징 - 각 쓰레드는 64개의 tcache를 ..

Heap 2022.10.24

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

bin 종류 사용이 끝난 청크들이 저장되는 객체로 메모리 낭비를 막고 해제된 청크를 빠르게 재사용할 수 있도록 해줌 ptmalloc 기준으로 총 128개가 정의되어 있음 smallbin(62개) - 32 바이트 이상 1024 바이트 미만의 크기를 갖는 청크들이 보관됨. 하나의 smallbin에는 같은 크기의 청크들만 보관되며 bin의 인덱스가 증가할 수록 16바이트씩 커짐 fastbin (10개) - 32 바이트 이상 176 바이트 이하 크기를 갖는 청크들이 보관됨. 16 바이트 단위로 총 10개의 fastbin이 존재하며 리눅스 기준으로 이 중에서 작은 크기부터 7개의 fastbin만 사용하여 결과적으로 32 바이트 이상 128 바이트 이하 청크들이 fastbin에 저장됨 largebin(63개) - ..

Heap 2022.10.22

Heap 기초(1) - 메모리 단편화 종류 / ptmalloc 객체

메모리 단편화(Memory Fragmentation) 종류 내부 단편화(Internal Fragmentation) : 할당한 메모리 공간의 크기에 비해 실제 데이터가 점유하는 공간이 적을 때 발생함 EX)택배 박스는 크지만 내용물이 작아 빈 공간이 많이 생김 외부 단편화(External Fragmentation) : 할당한 메모리 공간들 사이에 공간이 많아서 발생하는 비효율 EX) 택배 박스 안에 내용물들이 있지만 내용물들간의 사이에 공간이 많음 ptmalloc 객체 prev_size (8bytes) : 인접한 직전 청크의 크기로 청크를 병합할 때 직전 청크를 찾는 데 사용됨 size (8bytes) : 현재 청크의 크기를 뜻하며 헤더의 크기도 포함됨. 64bit 환경에서 사용 중인 청크 헤더의 크기는 ..

Heap 2022.10.21