리눅스 커널에서 사용하는 동적 메모리 할당자

커널 데이터 객체의 생성 및 소멸로 인한 오버헤드로 인한 성능 저하를 줄이기 위해 자주 사용되는 오브젝트들을 미리 만들어서 관리하는 방식

slab에 할당된 객체는 바로 해제되지 않고 재사용을 위해 캐싱된 상태를 유지한다

대부분의 디바이스 드라이버에서는 kmalloc 슬랩 캐시를 사용해 동적 메모리를 할당한다.

kmalloc() 함수를 호출하면 커널 내부에서는 kmalloc 슬랩 캐시를 사용한다.

kmalloc{,node}, kfree, kzalloc (kmalloc with zeroing)은 범용적인 메모리 할당에 사용되고, 특정한 크기의 메모리 할당이나 alignment가 필요한 경우는 kmem_cache를 만들어서 kmem_cache{alloc,free,alloc_node} 등을 사용한다.

SLAB에는 오브젝트의 cache hotness를 추적하기 위한 queue가 존재한다. per cpu queue, per node queue가 있으며, CPU 마다 CPU 이름의 queue가 존재하며 node 마다 shared queue가 있다.

또한 SLAB은 cold object expiration이 존재해서 cache hot하지 않다고 판단되는 오브젝트는 슬랩 캐시로 다시 돌려보내는 작업을 2초마다 수행한다.

SLUB(the unqueued slab allocator)은 현재 default slab allocator로서 slab에 비해 관리가 단순하다. partial list만을 사용하며, 메모리 지역성과 단편화가 향상되었다.