원래는 arena에 대한 설명만 하려 했는데 이 부분이 빠진 것 같아서 끼워넣기를 했다...heap 영역이 할당되는 과정기본적으로 malloc 등의 함수를 사용하지 않아도 132KB 크기의 initial heap이 존재한다. 그리고 할당 가능한 요구가 들어오면 heap segment를 확장한다. 여기서 확장하는 것을 sbrk()라고 한다.start_brk : 프로그램 초기 heap 주소를 나타내는 변수break location : heap의 끝 주소brk() : 프로세스의 heap 끝 주소를 설정하는데 사용된다. 프로세스가 런타임 중에 메모리를 필요로 할 때마다 break location을 조정하여 힙의 크기를 증가시키거나 감소시킨다. sbrk() : brk와 비슷한 역할을 하는데 brk와 차이점으로는 ..
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) 빠른 메..