Linux slob/slab/slub

概述 Linux初始化通过bootmem/memblock引导内存分配进行内存管理,支持buddy system完成相关初始化后,将物理内存分配的功能转交给buddy system,buddy system是以page为单位分配方式。 对于内核要经常创建的对象, 如task_struct,fs_struct, mm_struct 通常会放到高速缓存中,保留基本结构,从而可以重复使用他们, 这里需要用到slab分配器。 slab分配器 通过 buddy system 申请空闲页 将申请到页处理为更小的分配单元,为其他子系统提供缓冲区存放内核对象 缓存经常使用的对象,释放后保存器初始状态,再次分配对象速度会很快 充分利用硬件高速缓存 历史发展 1991 Initial K&R allocator 1996 SLAB allocator 2003 SLOB allocator 2004 NUMA SLAB 2007 SLUB allocator 2008 SLOB mulitlist 2011 SLUB fastpath rework 2013 Common slab code 2014 SLUBification of SLAB … 常用的分配器 SLOB: K&R allocator (1991-1999) SLAB: Solaris type allocator (1999-2008) SLUB: Unqueued allocator (2008-today SLOB 简单的空闲对象列表管理 遍历列表查找合适的空间,没有的话申请向伙伴系统申请page增加堆栈大小. 碎片化严重 优化: 按照不同大小多个链表,减少碎片。 原理图 ...

2020-07-11 · 6 min · 1207 words