Boundary Tag chunk가 할당 될 때는 해당 chunk의 크기 정보가 해당 chunk의 size에 저장이 된다. chunk가 해제 될 때는 해당 chunk의 크기 정보가 다음 chunk의 prev_size에 저장이 된다. 이러한 정보로 우리는 인접한 앞/뒤 chunk의 주소 계산이 가능하다. 인접한 다음 chunk의 주소 chunk(A)를 기준으로 chunk_addr(A) + size(A) = chunk_addr(B) 가 된다. 이를 통해 다음 chunk의 주소를 알 수 있다. 인접한 앞의 chunk가 free된 경우의 freed chunk의 주소 chunk(B)를 기준으로 chunk(A)가 해제되었다면 chunk(B)의 prev_size가 초기화 된다. 그래서 chunk_addr(B) - p..
우분투에서 사용하는 memory allocator는 ptmalloc2이지만 기본 알고리즘은 dlmalloc이니 dlmalloc을 기준으로 설명하겠다. (참고로 dlmalloc에서 멀티 쓰레드 기능이 추가된게 ptmalloc이다)heap은 특정 크기(0x21000)의 메모리 영역을 미리 할당한 뒤 이 영역을 사용하는 방식으로, free를 해도 이 영역안에 남아있다.#include int main(){ unsigned long *p1; p1 = malloc(0x640); free(p1);}최초의 malloc이 실행되기 전에는 heap영역이 설정되어있지 않다.malloc이 실행 된 후에 0x21000크기의 heap 영역이 설정된 것을 볼 수 있다.malloc이 실행되지 않았다고 heap 영역이..
Heap이란? 프로그램이 실행되는 도중 동적으로 할당하고 해제하여 사용하는 메모리 영역이다.현재 리눅스에서는 Memory Allocator로 ptmalloc2를 사용하고 있다. ptmalloc의 구현목표는 메모리의 효율적인 관리이다. 효율적인관리에는 크게 3가지 핵심 목표가 있다. 1) 메모리 낭비 방지메모리의 동적 할당과 해제는 매우 빈번하게 일어난다. 공간이 무한하지 않기 때문에 ptmalloc은 메모리 할당 요청이 발생하면 먼저 해제된 메모리 공간 중에 재사용이 가능한 공간이 있는지 탐색하고 해제된 메모리 공간중에 요청된 크기와 같은 크기의 메모리 공간이 있다면 이를 재사용한다. 또한 작은 크기를 요청할 경우 해제된 메모리 공간 중 매우 큰 메모리 공간이 있으면 그 영역을 나누어준다. 2) 빠른 메..