linux内核源码分析之slab
目录
概述
slab核心思想
kmem_cache结构
slab的结构
普通高速缓存和专用高速缓存
概述
slab它是由Sun 公司的一个雇员Jeff Bonwick,在 Solaris 2.4 中设计并实现的 slab优点:
slab缺点: 缓存队列管理复杂,调试调优困难,管理数据存储开销大 slab分配器代码量和复杂性都太高,在内核2.6开发期间增加了slab两个替代品( 备选分配器)
- slob分配器进行了特别优化,以便减少代码量。(从速度来说,它不是最高效的分配器,也不是为大型系统设计的)。
- slub:分配器通过将页帧打包为组,并通过struct page中未使用的字段来管理这些组,试图最小化所需的内存开销。
slab核心思想
slab分配器由一个紧密地交织的数据和内存结构的网络组成。使用对象的概念来管理内存,对象是相同的数据结构和大小的某个内存单元,比如mm_struct是一个对象。两部分组成:保存管理性数据的缓存对象和保存被管理对象的各个slab
每个缓存只负责一种对象类型 (例如struct task_struct 实例),或提供一般性的缓冲区。各个缓存中slab 的数目各有不同,这与已经使用的页的数目、对象长度和被管理对象的数目有关。 每个高速缓存通过kmem_cache结构来描述
kmem_cache结构
1)快速cpu_cache 指向一个数组的指针,其中保存了各个CPU最后释放的对象2)慢速 kmem_cache_node 每个内存节点都对应3个表头,用于组织slab的链表。 CPU高速缓存:内核假定刚释放的对象仍然处于CPU高速缓存中,会尽快再次分配它(响应下一个分配请求)。仅当per-CPU 缓存为空时,才会用 slab 中的空闲对象重新填充它们。 对象分配的体系就形成了一个三级的层次结构,分配成本和操作对CPU高速缓存和 TLB 的负面影响逐级升高。
- 仍然处于CPU高速缓存中的per-CPU对象
- 现存slab中未使用的对象
- 刚使用伙伴系统分配的新slab中未使用的对象
slab的结构
对象在slab中并非连续排列
对齐方式的两种方案
1,slab创建时使用标志SLAB_HWCACHE_ALIGN,slab用户可以要求对象按硬件缓存进行对齐
2, 如果不要求硬件缓存对齐,内核会按照BYTES_PER_WORD对齐,该值表示void 指针所需字节的数目。字节填充,加速对slab中对象的访问
3,通过slab着色(slab coloring)表示slab中的对象需要移动的特定偏移量,以便使对象放置到不同的缓存行
普通高速缓存和专用高速缓存
:~# cat /proc/slabinfo slabinfo - version: 2.1# name : tunables : slabdata file_lock_ctx 146 146 56 73 1 : tunables 0 0 0 : slabdata 2 2 0fsnotify_mark_connector 640 640 32 128 1 : tunables 0 0 0 : slabdata 5 5 0vm_area_struct 34618 36651 208 19 1 : tunables 0 0 0 : slabdata 1929 1929 0...mm_struct 156 195 1088 15 4 : tunables 0 0 0 : slabdata 13 13 0files_cache 322 322 704 23 4 : tunables 0 0 0 : slabdata 14 14 0signal_cache 518 518 1152 14 4 : tunables 0 0 0 : slabdata 37 37 0sighand_cache 476 525 2112 15 8 : tunables 0 0 0 : slabdata 35 35 0task_struct 755 855 6336 5 8 : tunables 0 0 0 : slabdata 171 171 0cred_jar 882 882 192 21 1 : tunables 0 0 0 : slabdata 42 42 0anon_vma_chain 15445 17920 64 64 1 : tunables 0 0 0 : slabdata 280 280 0anon_vma 9198 10258 88 46 1 : tunables 0 0 0 : slabdata 223 223 0pid 1696 1696 128 32 1 : tunables 0 0 0 : slabdata 53 53 0vmap_area 3520 3520 64 64 1 : tunables 0 0 0 : slabdata 55 55 0dma-kmalloc-8k 0 0 8192 4 8 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-4k 0 0 4096 8 8 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-2k 0 0 2048 16 8 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-1k 0 0 1024 16 4 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-512 0 0 512 16 2 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-256 0 0 256 16 1 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-128 0 0 128 32 1 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-64 0 0 64 64 1 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-32 0 0 32 128 1 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-16 0 0 16 256 1 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-8 0 0 8 512 1 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-192 0 0 192 21 1 : tunables 0 0 0 : slabdata 0 0 0dma-kmalloc-96 0 0 96 42 1 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-8k 0 0 8192 4 8 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-4k 0 0 4096 8 8 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-2k 0 0 2048 16 8 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-1k 0 0 1024 16 4 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-512 0 0 512 16 2 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-256 0 0 256 16 1 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-192 0 0 192 21 1 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-12864 64 128 32 1 : tunables 0 0 0 : slabdata 2 2 0kmalloc-rcl-96336 336 96 42 1 : tunables 0 0 0 : slabdata 8 8 0kmalloc-rcl-64 1152 1152 64 64 1 : tunables 0 0 0 : slabdata 18 18 0kmalloc-rcl-32 0 0 32 128 1 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-16 0 0 16 256 1 : tunables 0 0 0 : slabdata 0 0 0kmalloc-rcl-8 0 0 8 512 1 : tunables 0 0 0 : slabdata 0 0 0kmalloc-cg-8k 8 8 8192 4 8 : tunables 0 0 0 : slabdata 2 2 0kmalloc-cg-4k 21 24 4096 8 8 : tunables 0 0 0 : slabdata 3 3 0kmalloc-cg-2k 80 80 2048 16 8 : tunables 0 0 0 : slabdata 5 5 0kmalloc-cg-1k 558 624 1024 16 4 : tunables 0 0 0 : slabdata 39 39 0kmalloc-cg-512141 224 512 16 2 : tunables 0 0 0 : slabdata 14 14 0kmalloc-cg-256112 112 256 16 1 : tunables 0 0 0 : slabdata 7 7 0kmalloc-cg-192105 105 192 21 1 : tunables 0 0 0 : slabdata 5 5 0kmalloc-cg-128 64 64 128 32 1 : tunables 0 0 0 : slabdata 2 2 0kmalloc-cg-96 84 84 96 42 1 : tunables 0 0 0 : slabdata 2 2 0kmalloc-cg-64 192 192 64 64 1 : tunables 0 0 0 : slabdata 3 3 0kmalloc-cg-32 384 384 32 128 1 : tunables 0 0 0 : slabdata 3 3 0kmalloc-cg-162560 2560 16 256 1 : tunables 0 0 0 : slabdata 10 10 0kmalloc-cg-8 1536 1536 8 512 1 : tunables 0 0 0 : slabdata 3 3 0kmalloc-8k 140 140 8192 4 8 : tunables 0 0 0 : slabdata 35 35 0kmalloc-4k 1224 1224 4096 8 8 : tunables 0 0 0 : slabdata 153 153 0kmalloc-2k 2240 2240 2048 16 8 : tunables 0 0 0 : slabdata 140 140 0kmalloc-1k 1918 1936 1024 16 4 : tunables 0 0 0 : slabdata 121 121 0kmalloc-512 25810 26336 512 16 2 : tunables 0 0 0 : slabdata 1646 1646 0kmalloc-256 4132 4224 256 16 1 : tunables 0 0 0 : slabdata 264 264 0kmalloc-192 5905 6153 192 21 1 : tunables 0 0 0 : slabdata 293 293 0kmalloc-128 3232 3232 128 32 1 : tunables 0 0 0 : slabdata 101 101 0kmalloc-96 3102 3318 96 42 1 : tunables 0 0 0 : slabdata 79 79 0kmalloc-64 11132 11840 64 64 1 : tunables 0 0 0 : slabdata 185 185 0kmalloc-32 41600 41600 32 128 1 : tunables 0 0 0 : slabdata 325 325 0kmalloc-16 13824 13824 16 256 1 : tunables 0 0 0 : slabdata 54 54 0kmalloc-8 10752 10752 8 512 1 : tunables 0 0 0 : slabdata 21 21 0kmem_cache_node 192 192 64 64 1 : tunables 0 0 0 : slabdata 3 3 0kmem_cache 176 176 256 16 1 : tunables 0 0 0 : slabdata 11 11 0
专用缓存是内核其它地方用到的缓存,如:task_struct ,mm_struct
普通高速缓存是slab用于自己目的的缓存,如:kmalloc-8 kmalloc-16 等
除了名字还有其他信息
- 缓存中活动对象的数量。
- 缓存中对象的总数(已用和未用)。
- 所管理对象的长度,按字节计算。
- 一个slab中对象的数量。
- 每个slab中页的数量。
- 活动slab的数量。
- 在内核决定向缓存分配更多内存时,所分配对象的数量。每次会分配一个较大的内存块,以 减少与伙伴系统的交互。在缩小缓存时,也使用该值作为释放内存块的大小。
参考
《深入Linux内核架构》
https://course.0voice.com/v1/course/intro?courseId=2&agentId=0
创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖