출처: 리눅스 커널 내부구조
리눅스에서 메모리의 최소 할당 단위는 페이지 프레임이라고 알고 있다. 근데 만약 그 이하의 공간이 필요할 때는 어떻게 하는 게 좋을까? 그냥 4kb 던져주는게 좋을까? 말할것도 없이 공간낭비이다.
대신 미리 정해진 사이즈의 cache를 가지고 있다가 필요할 때 할당한다면 어떨까? 32byte에서 2의 오더로 128kb 까지 유지해서 말이다.
각 cache들은 슬랩들로 구성되고, 슬랩은 다시 객체(Object)들로 구성된다.
예를 들어 64byte cache이면,
Object (64byte) --> slab (full/free/partial) --> cache
와 같은 구조로 이루어져 있다. 64byte 공간들이 각각의 객체이고, 이 객체들이 슬랩이 되고, 이 슬랩들이 cache가 되는 것이다.
참고로 리눅스는 다양한 크기의 캐시를 효율적으로 관리하기 위해 kmem_cache_t라는 자료 구조를 만들어 두었고, 새로운 캐시를 생성시에 kmem_cache_t라는 구조체로부터 할당 받는다. 이 때 슬랩할당자로부터 할당받는 것이다.
kmem_cache_t 구조체 크기의 객체를 담고 있는 cache의 이름이 cache_cache이다.
당연히 cache_cache는 다른 캐시들보다 먼저 생성되어야 한다(그래야 다른 캐시를 만들 때 할당이 가능하지 않겠는가?) 그 후에 cache_cache를 이용해서 kmem_cache_t를 위한 공간을 할당받아 다양한 캐시를 생성한다.
슬랩할당자는 이외에도 외부 인터페이스 함수로 kmalloc(), kfree()를 제공한다.(그래서 kmalloc()를 통해 한번에 할당 받는 최대 크기가 128k라는 걸 눈치 챘을 것이다.)