前言
本文是阅读 kernel 文档中关于 Slab 分配器的文档所写的笔记。
slab分配器背后的基本思想:让常用对象的缓存保持在初始化状态供给内核使用。
slab 分配器的三个主要目标
- 分配小内存块有助于消除由伙伴系统引起的内部碎片。slab内部维护了两组小内存缓冲区的缓存,范围从32字节到131072(2的17次方)字节。
- 缓存常用的对象,使系统不会浪费时间分配、初始化和销毁对象。当创建一个新的slab时,将很多对象进行打包并且进行初始化;当对象被释放,它保持其初始化状态,以便于下一次的对象分配。
- 通过将对象与L1与L2缓存对齐,更好利用硬件缓存。这是slab的最本质的任务,如果一个对象打包进slab后还有剩余空间,slab就将其进行着色,使其与CPU L1缓存对齐。
主体
slabs_full 的所有对象都在使用中。 slabs_partial 中有空闲对象,因此是分配对象的主要候选者。 slabs_free 没有分配的对象,是slab 销毁的主要候选者。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| struct kmem_cache_node { spinlock_t list_lock;
#ifdef CONFIG_SLAB struct list_head slabs_partial; struct list_head slabs_full; struct list_head slabs_free; unsigned long total_slabs; unsigned long free_slabs; unsigned long free_objects; unsigned int free_limit; unsigned int colour_next; struct array_cache *shared; struct alien_cache **alien; unsigned long next_reap; int free_touched; #endif
#ifdef CONFIG_SLUB unsigned long nr_partial; struct list_head partial; #ifdef CONFIG_SLUB_DEBUG atomic_long_t nr_slabs; atomic_long_t total_objects; struct list_head full; #endif #endif
};
|