CS:APP 9.9절 Dynamic Memory Allocator 시뮬레이터 (short1-bal.rep)

Jinhoon Yoon·어제

(short1-bal.rep)


[오후 3:24:40] 힙 초기화 완료: 프롤로그(16B), 대형 가용 블록(20,000B), 에필로그(0B)

Q. 현재 상태에서 프롤로그와 에필로그는 왜 내부 단편화가 없을까?
A. 내부 단편화(Internal Fragmentation)의 정의는 "유저가 요청한 페이로드(Payload)보다 할당된 블록 크기가 더 커서 남는 버려진 공간.

버그나 누락이 아니라, 페이로드를 전혀 담지 않는 경계 메타데이터 블록이므로, 내부 단편화(패딩) 계산 대상에서 원천 배제되었기 때문.

  • 프롤로그 블록 (PRO, 16 Bytes)
    • 내부 구성
      • 8바이트 헤더 + 8바이트 푸터 = 16바이트.
    • 페이로드(사용자 데이터 영역)
      • 아예 없음. 요청 크기 대비 남는 공간(패딩) 이라는 개념 자체가 성립하지 않음
  • 에필로그 블록 (EPI, 0 Bytes)
    • 내부 구성
      • 힙의 끝을 표시하는 크기 0짜리 헤더 1개.
      • 전체 크기 자체가 0바이트: 블록 자체의 크기가 0바이트이므로 남는 공간(패딩)이 들어갈 자리도 없음

a 0 2040

[오후 3:50:20] 블록 분할 발생: [20000B] -> [할당 2064B] + [가용 자투리 17936B]

[오후 3:50:20] malloc(2040) 호출 -> 정렬/헤더 포함 요구 크기: 2064B

  • 힙에 ptr[0] 과 8바이트 패딩이 안착된 상태.
  • 헤더(8) + 페이로드(2040) + 푸터(8) = 2056바이트이지만, 16바이트 정렬 배수를 맞추기 위해 2064바이트로 올림 됨


a 1 2040

[오후 4:07:24] 블록 분할 발생: [17936B] -> [할당 2064B] + [가용 자투리 15872B]

[오후 4:07:24] malloc(2040) 호출 -> 정렬/헤더 포함 요구 크기: 2064B


f 1

  • 방금 해제된 ptr[1] 자리가 뒤쪽 가용 공간과 즉시 합쳐져 거대한 녹색 가용 블록인 FB (17936B | a=0)으로 확장

[오후 4:15:36] Case 2: 다음 가용 블록과 병합 -> 새 크기: 17936B

[오후 4:15:36] free(ptr[1]) 호출: 크기 2064B 반납


a 2 48

[오후 4:22:48] 블록 분할 발생: [17936B] -> [할당 64B] + [가용 자투리 17872B]

[오후 4:22:48] malloc(48) 호출 -> 정렬/헤더 포함 요구 크기: 64B


a 3 4072

[오후 7:07:46] 블록 분할 발생: [17872B] -> [할당 4096B] + [가용 자투리 13776B]

[오후 7:07:46] malloc(4072) 호출 -> 정렬/헤더 포함 요구 크기: 4096B


f 3

[오후 7:20:36] Case 2: 다음 가용 블록과 병합 -> 새 크기: 17872B

[오후 7:20:36] free(ptr[3]) 호출: 크기 4096B 반납


a 4 4072

[오후 7:23:30] 블록 분할 발생: [17872B] -> [할당 4096B] + [가용 자투리 13776B]

[오후 7:23:30] malloc(4072) 호출 -> 정렬/헤더 포함 요구 크기: 4096B


f 0

[오후 7:30:29] Case 1: 인접 블록 모두 할당 상태 -> 병합 없음

[오후 7:30:29] free(ptr[0]) 호출: 크기 2064B 반납


f 2

[오후 7:30:57] Case 3: 이전 가용 블록과 병합 -> 새 크기: 2128B

[오후 7:30:57] free(ptr[2]) 호출: 크기 64B 반납


a 5 4072

[오후 7:37:18] 블록 분할 발생: [13776B] -> [할당 4096B] + [가용 자투리 9680B]

[오후 7:37:18] malloc(4072) 호출 -> 정렬/헤더 포함 요구 크기: 4096B


f 4

[오후 7:39:33] Case 3: 이전 가용 블록과 병합 -> 새 크기: 6224B

[오후 7:39:33] free(ptr[4]) 호출: 크기 4096B 반납


f 5

[오후 7:39:59] Case 4: 이전 및 다음 블록 동시 병합 -> 새 크기: 20000B

[오후 7:39:59] free(ptr[5]) 호출: 크기 4096B 반납

0개의 댓글