아키텍처 개요
Slab Allocation은 계층적 구조로 설계되었습니다. 상단의 캐시(Cache) 계층이 클라이언트 인터페이스를 제공하고, 하단의 페이지 할당자(Page Allocator)와 연결되는 2단계 프리리스트 구조를 운영합니다. 각 캐시는 특정 객체 타입에 대해 독립적으로 작동하며, 슬랩(Slab)이라는 1개 이상의 페이지로 이루어진 단위로 메모리를 취급합니다.
객체 캐싱의 핵심 원리
일반적으로 객체 할당/해제 비용보다 생성자/소멸자 호출 비용이 훨씬 큽니다. Slab은 할당된 객체의 "구성된 상태"(mutexes, reference counts, linked lists 등)를 유지하며 캐시하므로, 재사용 시 생성자를 다시 호출하지 않습니다. 이를 통해 Stream Head 객체의 할당/해제 비용을 33μsec에서 5.7μsec로 단축할 수 있습니다.
실무적 주의점과 설계 고려사항
CPU별 활성 슬랩 구조(SLUB의 경우)에서 할당은 락 없이 수행되지만, 부분 채워진 슬랩 목록으로 전환할 때는 느린 경로를 거칩니다. 색상화(Coloring) 기법으로 동일 크기 객체들이 CPU 캐시 라인에 균등 분배되도록 하여 버스 불균형을 43%에서 17%로 감소시킵니다. 내부 단편화는 1/n 이상 초과하지 않도록 슬랩 크기로 제어 가능합니다.