슬랩 할당자(Slab Allocator)는 커널 객체(inode, task_struct 등)를 위한 캐시 기반 메모리 할당자다. 자주 할당/해제되는 고정 크기 객체를 미리 준비해두어 할당 오버헤드를 최소화하고 내부 단편화를 줄인다.
핵심 구조
캐시 (task_struct_cache):
┌─────────────────────────────────────────┐
│ Slab 1: [obj][obj][obj][obj][obj][obj] │ ← 완전 사용
│ Slab 2: [obj][obj][ ][obj][ ][ ] │ ← 부분 사용
│ Slab 3: [ ][ ][ ][ ][ ][ ] │ ← 비어있음
└─────────────────────────────────────────┘
각 Slab = 연속된 물리 페이지들
SLAB, SLUB, SLOB
| SLAB | SLUB | SLOB |
|---|
| 특징 | 원조, 복잡 | 단순화, 현재 기본 | 임베디드용 |
| 메모리 오버헤드 | 높음 | 낮음 | 매우 낮음 |
| 디버깅 | 용이 | 보통 | 어려움 |
동작
c
// 커널 내부: 캐시 생성
struct kmem_cache *task_cache = kmem_cache_create(
"task_struct", // 이름
sizeof(struct task_struct), // 객체 크기
0, // 정렬
SLAB_HWCACHE_ALIGN, // 플래그
NULL // 생성자
);
// 할당
struct task_struct *task = kmem_cache_alloc(task_cache, GFP_KERNEL);
// 반환 (메모리 해제 없이 슬랩에 반환)
kmem_cache_free(task_cache, task);
관련 개념