리눅스 커널에서 사용하는 동적 메모리 할당자
커널 데이터 객체의 생성 및 소멸로 인한 오버헤드로 인한 성능 저하를 줄이기 위해 자주 사용되는 오브젝트들을 미리 만들어서 관리하는 방식
slab에 할당된 객체는 바로 해제되지 않고 재사용을 위해 캐싱된 상태를 유지한다
슬랩 cache
커널에서 자주 사용하는 구조체에 대한 동적 메모리를 미리 확보하고 관리하는 주체
슬랩 cache는 슬랩 object의 시작 주소를 반환한다
슬랩 object
슬랩 cache가 미리 할당해놓은 메모리 공간
슬랩 page
슬랩 object로 구성된 page
대부분의 디바이스 드라이버에서는 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만을 사용하며, 메모리 지역성과 단편화가 향상되었다.