>[!tldr] Slab allocator
>The *slab allocator* is a [[Memory allocator|memory allocator]] used in the [[Linux|linux]] kernel to efficiently allocate and reuse small, fixed-size objects (e.g., process descriptors, file system inodes).
>
>**How It Works**
>
>1. **Preallocation of Objects**
> - Memory is divided into **large contiguous regions** called **slabs**.
> - Each slab is further divided into **fixed-size chunks**, each designed to hold **a specific type of kernel object** (e.g., task structs, buffers).
>2. **Object Reuse & Caching**
> - Instead of frequently allocating and freeing memory from the general heap, the slab allocator maintains a **cache of preallocated objects**.
> - When a new object is needed, it is taken from an available slot in a slab, avoiding costly memory allocation operations.
>3. **Memory Efficiency**
>- Because objects fit exactly into slab slots, there is no [[Internal fragmentation|internal fragmentation]] or [[External fragmentation|external fragmentation]].
> - Slabs can be **partially filled**, fully allocated, or completely free. Fully free slabs can be **released back to the system**, reclaiming memory.
>
>**Advantages & Trade-offs**
>
>**Fast allocation & deallocation**: Objects are preallocated and reused.
>**No fragmentation**: Objects fit precisely into preallocated slabs.
>**Efficient for frequently used objects**: Great for kernel structures like inodes, task structs, and buffers.
>**Not ideal for variable-sized allocations**: Works best when objects are of predictable, uniform sizes.
>
>![[slab_allocator.png]]