블록 분할(Splitting) 로직과 최소 블록 크기 관리
이번 포스트에서는 메모리 할당 시에 필요한 만큼만을 사용하고, 남은 부분을 효율적으로 관리하기 위한 블록 분할(Splitting) 기법에 대해 살펴보겠습니다. 잘못된 분할은 오히려 단편화를 악화시킬 수 있기 때문에 주의가 필요합니다.
블록 분할이란?
블록 분할이란 free block이 요청 크기보다 클 경우, 요청한 크기만큼 할당하고 남는 부분은 새로운 free block으로 남겨두는 기법을 말하는데요.
예를 들어, 64바이트 크기의 free block에 대해 24바이트를 요청하면, 24바이트를 할당하고 나머지 40바이트를 새로운 free block으로 나누는 방식입니다.
분할 조건
그런데 블록을 항상 분할하는 것은 아닌데요. 최소한 아래의 조건을 만족할 때에만 분할을 진행하게 됩니다.
- 남는 공간이 최소 블록 크기 이상이어야 한다.
- 최소 블록 크기는 보통 Header + Footer + 최소 Payload로 결정된다.
- 16B(32비트 기준) 또는 24B(64비트 기준)
64비트 시스템에서는 일반적으로 최소 블록 크기를 24바이트(3 words)로 설정합니다.
분할 기본 로직
분할할 때는 다음과 같은 순서로 처리합니다.
- 요청 크기(asize)로 블록을 할당한다.
- 남은 공간이 2 * DSIZE 이상이면, 분할 후 남은 공간에 대해 새로운 free block을 생성한다.
- 남은 공간이 너무 작으면 분할하지 않고 전체 블록을 통째로 할당한다.
분할 시 주의사항
- 과도한 분할은 금물
- 너무 작은 조각(splinter)이 남으면 오히려 단편화가 증가할 수 있다.
- 남은 블록은 정확히 Free List에 삽입
- 명시적 가용 리스트(Explicit Free List)를 사용하는 경우 pred/succ 업데이트 필요
- 할당 블록과 free 블록의 헤더/푸터 업데이트를 정확히 수행
실제 코드 예시
아래의 C 코드는 블록 분할 로직 예시인데요. csize
(배치할 free block의 크기)와 asize
(할당을 위해 필요한 블록 크기)를 통해 분할 여부를 결정하게 됩니다.
if ((csize - asize) >= 2 * DSIZE) {
// 분할 가능
PUT(HDRP(bp), PACK(asize, 1));
PUT(FTRP(bp), PACK(asize, 1));
bp = NEXT_BLKP(bp);
PUT(HDRP(bp), PACK(csize-asize, 0));
PUT(FTRP(bp), PACK(csize-asize, 0));
} else {
// 분할하지 않고 전체 할당
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
}
이 로직은 분할 여부를 판단하고, 필요한 경우 새로운 free block을 만드는 핵심 흐름이지요.
마치면서
이번 편에서는 블록 분할(Splitting) 기법과 최소 블록 크기 관리에 대해 알아봤습니다. 적절한 분할은 메모리 활용을 높이지만, 잘못된 분할은 오히려 단편화를 악화시킬 수 있다는 점을 꼭 기억하셨으면 좋겠습니다.
다음 편에서는 구체적인 블록 병합(Coalescing) 로직과 코드 구현을 중심으로 이어서 살펴보겠습니다. 감사합니다.
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 9장 완전 정복] 9.9(Part 10) 할당기 설계 시 고려해야 할 제약과 목표 (0) | 2025.04.26 |
---|---|
[CSAPP 9장 완전 정복] 9.9(Part 9) 블록 병합(Coalescing) 로직과 실제 구현 (0) | 2025.04.26 |
[CSAPP 9장 완전 정복] 9.9(Part 7) 블록 배치(Placement) 정책의 종류와 장단점 (0) | 2025.04.26 |
[CSAPP 9장 완전 정복] 9.9(Part 6) 메모리 단편화(Fragmentation)와 대응 전략 (0) | 2025.04.26 |
[CSAPP 9장 완전 정복] 9.9(Part 5) malloc과 free의 동작 원리와 구현 흐름 (0) | 2025.04.26 |