slab : 하나 이상의 physically contiguous pages로 구성됨
cache : 하나 이상의 slab으로 구성됨
- unique kernel data structure마다 cache가 존재
- cache가 나타내는 자료구조의 instance로 구성되어 있다.
- 할당 원리
- cache가 만들어짐 -> free 상태인 객체들이 cache에 할당됨. (cache는 slab로 구성되므로 slab의 크기에 맞는 수의 객체가 생성됨.)
- new object for a kernel data structure가 필요해짐 -> cache에 있는 free object가 할당됨 -> used로 상태가 바뀐다.
slab의 상태?
- Full
- Empty
- Partial
- slab은 free, used상태를 모두 포함하고 있음.
- 할당 순서
- Partial -> partial이 없다? -> Empty -> Empty도 없다? -> 새로운 slab이 contiguous physical pages에서 할당되서 cache에 assign되고, 이 empty slab에서 할당된다.
Slab allocator의 장점
- fragmentation에 의한 메모리 낭비가 없다.
- 애초에 각 자료구조에 맞춰서 설계를 했기 때문에 딱 요청된 자료구조의 사이즈 만큼이 할당된다.
- 메모리 요청이 빠르게 이루어진다.
- 자주 할당/할당 해제가 이루어질 때 굉장히 효과적이다. (특히 커널에서는 이런 상황이 자주 발생함.)
- 요청을 할 때 마다 메모리를 할당하고 할당 해제하는 것이 아닌, 미리 cache에 할당을 해 놓았다가 필요시에 제공만 해주고, 마찬가지로 메모리를 할당 해제하는 것이 아니라 다시 cache에 돌려놓기만 하면 되기 때문.
실제 예시
- 최신 리눅스의 경우 SLAB이 아니라 SLOB, SLUB allocator도 포함한다.
- SLOB : Simple List Of Blocks
- SLUB : 대충 SLAB 상위호환.
참고 자료
- Abraham Silberschatz, Operating System Concepts, 10th edition