Heap 블록 구조와 메모리 관리 기초
이번 포스트에서는 Heap 블록이 실제로 어떻게 구성되어 있는지와, 이를 효율적으로 관리하기 위한 블록 배치와 블록 분할/병합 기법은 무엇인지 함께 살펴보겠습니다. 동적 메모리 관리는 단순한 할당과 해제를 넘어서, 메모리 조각화(fragmentation)를 최소화하기 위한 세심한 전략이 필요합니다.
Heap 블록의 기본 구조
Heap에 할당되는 각 블록은 단순히 사용자 데이터(payload)만 담고 있지 않은데요. 블록마다 자체 정보를 담은 Header와 때로는 Footer가 추가로 존재합니다.
- Header: 블록 크기와 할당 여부(allocated/free)를 저장
- Payload: 실제 사용자 데이터가 저장되는 영역
- Padding: 메모리 정렬(주로 8바이트 또는 16바이트)을 위한 공간
- Footer (필요시): 블록 끝에도 크기와 할당 정보를 저장하여 빠른 병합을 지원
이 구조는 메모리 단편화를 줄이고, 빠른 탐색 및 병합(coalescing)을 가능하게 해줍니다.
Heap 블록의 Header/Footer 포맷
Header와 Footer는 일반적으로 4바이트(32비트 기반)또는 8바이트(64비트 기반) 크기이며, 다음 정보를 담고 있습니다.
- 블록 전체 크기 (Payload + Overhead)
- 할당 여부 (1비트)
예를 들어, 24바이트 크기로 할당된 블록이라면 Header에는 0x19
(24 + 1) 같은 값이 저장됩니다. 가장 하위 비트는 "할당 여부"를 나타내죠.
블록 배치(Placement) 정책
malloc()
호출 시, 요청 크기에 맞는 블록을 어떻게 찾아 배치할지가 성능과 단편화에 큰 영향을 미치는데요. 대표적인 배치 정책은 다음과 같습니다.
- First-Fit: 처음으로 맞는 블록에 배치
- Next-Fit: 최근 검색한 위치 이후에서 찾기 시작
- Best-Fit: 크기가 가장 근접한 블록에 배치하여 낭비 최소화
각 방법은 탐색 속도와 메모리 활용률 간의 트레이드오프가 존재합니다. First-Fit은 빠르지만 외부 단편화를 유발할 수 있고, Best-Fit은 메모리는 아낄 수 있지만 검색 시간이 길어질 수 있습니다.
블록 분할(Splitting)과 병합(Coalescing)
블록을 효율적으로 사용하기 위해서는 다음과 같은 전략들이 필요합니다.
블록 분할 (Splitting)
요청한 크기보다 큰 블록을 할당할 경우, 남는 부분을 새로운 free block으로 분할할 수 있습니다. 다만, 남은 공간이 최소 블록 크기 이상이어야만 분할이 이뤄집니다.
블록 병합 (Coalescing)
해제된 블록 주변에 free block이 있다면 이들을 즉시 병합하거나 필요 시 병합할 수 있습니다. 병합은 외부 단편화를 줄이고, 큰 메모리 요청을 처리할 가능성을 높여줍니다.
이를 빠르게 처리하기 위해 Boundary Tag 기법을 사용하여 블록의 앞/뒤 상태를 O(1) 시간에 파악할 수 있습니다.
마치면서
이번 글에서는 Heap 블록이 어떤 형태로 관리되고, 이를 통해 메모리를 얼마나 효율적으로 사용할 수 있는지에 대해 알아보았는데요. 단순한 malloc/free 호출 이면에는 이렇게 복잡하고 정교한 메모리 관리 전략이 숨어 있다니 참 놀랍지 않나요?
다음 편에는 암시적(Implicit) vs 명시적(Explicit) Free List라는 주제로, Free Block을 어떻게 조직하고 관리하는지가 시스템 성능에 어떤 영향을 미치는지를 살펴보겠습니다.
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 9장 완전 정복] 9.9(Part 4) Boundary Tag와 블록 병합(Coalescing) 기법 (0) | 2025.04.26 |
---|---|
[CSAPP 9장 완전 정복] 9.9(Part 3) 암시적 가용 리스트(Implicit Free List) vs 명시적 가용 리스트(Explicit Free List) (0) | 2025.04.26 |
[CSAPP 9장 완전 정복] 9.9(Part 1) 동적 메모리 할당이란 무엇이며 왜 필요할까? (0) | 2025.04.26 |
[CSAPP 9장 완전 정복] 9.9 rawdata 공유 (전체 학습 목표, 학습 정리 자료) (0) | 2025.04.25 |
[CSAPP 9장 완전 정복] 9.8 메모리 매핑 - mmap으로 파일을 메모리처럼 사용하는 방법 (0) | 2025.04.23 |