

최근 구현한 메모리 할당기는 Segregated Free List + Best Fit 전략을 기반으로 합니다. 놀랍게도 이 전략은 기존 방식보다 훨씬 뛰어난 처리량(Throughput) 을 보여주었습니다. 아래는 성능 테스트 결과와 분석입니다.
Perf index = 45 (util) + 40 (thru) = 85/100
find_fit() - Segregated + Best Fit 전략static void *find_fit(size_t asize)
{
int index = get_list_index(asize);
void *bp;
void *best_bp = NULL;
size_t min_diff = (size_t)-1;
for (int i = index; i < NUM_CLASSES; i++)
{
for (bp = segregated_lists[i]; bp != NULL; bp = GET_SUCC(bp))
{
size_t csize = GET_SIZE(HDRP(bp));
if (csize >= asize && (csize - asize) < min_diff)
{
min_diff = csize - asize;
best_bp = bp;
if (min_diff == 0) return bp;
}
}
if (best_bp != NULL) return best_bp;
}
return NULL;
}
Best Fit은 보통 리스트 전체 탐색 때문에 느립니다. 하지만 Segregated List를 사용하면 탐색 리스트의 크기 자체가 작아지기 때문에, Best Fit의 약점이 거의 사라집니다.
Single List는 수천 개 블록을 순차 탐색해야 함.Segregated List는 보통 1~2개 클래스 내에서 수십 개 블록만 탐색하면 끝남.| 전략 | 평균 처리량(Kops) | 평균 공간 효율(%) |
|---|---|---|
| Single List + First Fit | 약 4,500 | ~90 |
| Single List + Best Fit | 약 900 | ~90 |
| Segregated List + First Fit | 약 15,538 | 73 |
| Segregated List + Best Fit | 48,654 | 74 |
🚀 Best Fit이라고 무조건 느리다는 고정관념은
Segregated List를 만나면 완전히 무너집니다!
Segregated Free List의 탐색 범위 감소 장점과 Best Fit의 효율적 공간 활용이 최고의 시너지를 보였습니다.ㅠ-ㅠ