[CSAPP 9장 완전 정복] 9.9(Part 2) Heap 블록 구조와 메모리 관리 기초

2025. 4. 26. 11:40·크래프톤 정글/컴퓨터구조(CSAPP)

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
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 9장 완전 정복] 9.9(Part 4) Boundary Tag와 블록 병합(Coalescing) 기법
  • [CSAPP 9장 완전 정복] 9.9(Part 3) 암시적 가용 리스트(Implicit Free List) vs 명시적 가용 리스트(Explicit Free List)
  • [CSAPP 9장 완전 정복] 9.9(Part 1) 동적 메모리 할당이란 무엇이며 왜 필요할까?
  • [CSAPP 9장 완전 정복] 9.9 rawdata 공유 (전체 학습 목표, 학습 정리 자료)
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무) N
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 9장 완전 정복] 9.9(Part 2) Heap 블록 구조와 메모리 관리 기초
상단으로

티스토리툴바