Heap이란?
프로그램이 실행되는 도중 동적으로 할당하고 해제하여 사용하는 메모리 영역이다.
현재 리눅스에서는 Memory Allocator로 ptmalloc2를 사용하고 있다. ptmalloc의 구현목표는 메모리의 효율적인 관리이다. 효율적인관리에는 크게 3가지 핵심 목표가 있다.
1) 메모리 낭비 방지
메모리의 동적 할당과 해제는 매우 빈번하게 일어난다. 공간이 무한하지 않기 때문에 ptmalloc은 메모리 할당 요청이 발생하면 먼저 해제된 메모리 공간 중에 재사용이 가능한 공간이 있는지 탐색하고 해제된 메모리 공간중에 요청된 크기와 같은 크기의 메모리 공간이 있다면 이를 재사용한다. 또한 작은 크기를 요청할 경우 해제된 메모리 공간 중 매우 큰 메모리 공간이 있으면 그 영역을 나누어준다.
2) 빠른 메모리 재사용
해제된 메모리 공간을 빠르게 재사용하려면 해제된 메모리 공간의 주소를 기억하고 있어야 한다. 이를 위해 ptmalloc은 메모리 공간을 해제할 때, tcache또는 bin이라는 연결 리스트에 해제된 공간의 정보를 저장해둔다. tcache와 bin은 크기에 따라 나눠져있어서 관련된 저장소만 탐색하면 되므로 더욱 효율적으로 공간을 재사용할 수 있다.
3) 메모리 단편화 방지
메모리 단편화는 내부 단편화와 외부 단편화가 있다.
내부 단편화 : 할당한 메모리 공간의 크기에 비해 실제 데이터의 크기가 적어서 남은 공간이 낭비된다.
외부 단편화 : 할당한 메모리 공간들 사이에 공간이 많아서 충분한 크기가 있음에도 불연속적인 공간이여서 작업을 수행하지 못한다.
메모리 단편화를 줄이기 위해서 ptmalloc은 정렬과 병합, 분할을 사용한다.
정렬 : ptmalloc은 메모리 공간을 16바이트 단위로 정렬한다. 즉 1~16바이트를 요청하면 모두 16바이트로 할당하고 17~32바이트를 요청하면 모두 32바이트만큼 할당한다. 이는 내부 단편화가 일어나지만 외부 단편화는 감소시키는 효과가 있다. 이러한 방식을 사용하는 이유는 대부분 비슷한 크기의 요청이 발생할 확률이 높기 때문에 chunk의 재사용률을 높일 수 있기 때문이다.
병합 : ptmalloc은 특정 조건을 만족하면 해제된 공간들을 합쳐서 큰 크기의 요청에 반환한다.
분할 : ptmalloc은 작은 크기의 요청에는 분할하여 재사용한다.
<틀린 부분이 있다면 비난과 욕설을 해주세요>
'포너블 > Heap' 카테고리의 다른 글
malloc 소스코드 분석(libc 2.23) (0) | 2023.08.02 |
---|---|
heap의 개념-(4) (0) | 2023.07.23 |
heap의 개념-(3) (0) | 2023.07.10 |
Heap의 개념-(2) (4) | 2023.07.06 |
K0n9의 heap부터 시작하는 pwnable이야기 (4) | 2023.06.28 |