linux内核源码分析之slab
Posted 为了维护世界和平_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核源码分析之slab相关的知识,希望对你有一定的参考价值。
目录
概述
slab它是由Sun 公司的一个雇员Jeff Bonwick,在 Solaris 2.4 中设计并实现的 slab优点:- 比页更小的内存对象
- 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 <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
file_lock_ctx 146 146 56 73 1 : tunables 0 0 0 : slabdata 2 2 0
fsnotify_mark_connector 640 640 32 128 1 : tunables 0 0 0 : slabdata 5 5 0
vm_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 0
files_cache 322 322 704 23 4 : tunables 0 0 0 : slabdata 14 14 0
signal_cache 518 518 1152 14 4 : tunables 0 0 0 : slabdata 37 37 0
sighand_cache 476 525 2112 15 8 : tunables 0 0 0 : slabdata 35 35 0
task_struct 755 855 6336 5 8 : tunables 0 0 0 : slabdata 171 171 0
cred_jar 882 882 192 21 1 : tunables 0 0 0 : slabdata 42 42 0
anon_vma_chain 15445 17920 64 64 1 : tunables 0 0 0 : slabdata 280 280 0
anon_vma 9198 10258 88 46 1 : tunables 0 0 0 : slabdata 223 223 0
pid 1696 1696 128 32 1 : tunables 0 0 0 : slabdata 53 53 0
vmap_area 3520 3520 64 64 1 : tunables 0 0 0 : slabdata 55 55 0
dma-kmalloc-8k 0 0 8192 4 8 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-4k 0 0 4096 8 8 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-2k 0 0 2048 16 8 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-1k 0 0 1024 16 4 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-512 0 0 512 16 2 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-256 0 0 256 16 1 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-128 0 0 128 32 1 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-64 0 0 64 64 1 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-32 0 0 32 128 1 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-16 0 0 16 256 1 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-8 0 0 8 512 1 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-192 0 0 192 21 1 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-96 0 0 96 42 1 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-8k 0 0 8192 4 8 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-4k 0 0 4096 8 8 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-2k 0 0 2048 16 8 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-1k 0 0 1024 16 4 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-512 0 0 512 16 2 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-256 0 0 256 16 1 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-192 0 0 192 21 1 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-128 64 64 128 32 1 : tunables 0 0 0 : slabdata 2 2 0
kmalloc-rcl-96 336 336 96 42 1 : tunables 0 0 0 : slabdata 8 8 0
kmalloc-rcl-64 1152 1152 64 64 1 : tunables 0 0 0 : slabdata 18 18 0
kmalloc-rcl-32 0 0 32 128 1 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-16 0 0 16 256 1 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-rcl-8 0 0 8 512 1 : tunables 0 0 0 : slabdata 0 0 0
kmalloc-cg-8k 8 8 8192 4 8 : tunables 0 0 0 : slabdata 2 2 0
kmalloc-cg-4k 21 24 4096 8 8 : tunables 0 0 0 : slabdata 3 3 0
kmalloc-cg-2k 80 80 2048 16 8 : tunables 0 0 0 : slabdata 5 5 0
kmalloc-cg-1k 558 624 1024 16 4 : tunables 0 0 0 : slabdata 39 39 0
kmalloc-cg-512 141 224 512 16 2 : tunables 0 0 0 : slabdata 14 14 0
kmalloc-cg-256 112 112 256 16 1 : tunables 0 0 0 : slabdata 7 7 0
kmalloc-cg-192 105 105 192 21 1 : tunables 0 0 0 : slabdata 5 5 0
kmalloc-cg-128 64 64 128 32 1 : tunables 0 0 0 : slabdata 2 2 0
kmalloc-cg-96 84 84 96 42 1 : tunables 0 0 0 : slabdata 2 2 0
kmalloc-cg-64 192 192 64 64 1 : tunables 0 0 0 : slabdata 3 3 0
kmalloc-cg-32 384 384 32 128 1 : tunables 0 0 0 : slabdata 3 3 0
kmalloc-cg-16 2560 2560 16 256 1 : tunables 0 0 0 : slabdata 10 10 0
kmalloc-cg-8 1536 1536 8 512 1 : tunables 0 0 0 : slabdata 3 3 0
kmalloc-8k 140 140 8192 4 8 : tunables 0 0 0 : slabdata 35 35 0
kmalloc-4k 1224 1224 4096 8 8 : tunables 0 0 0 : slabdata 153 153 0
kmalloc-2k 2240 2240 2048 16 8 : tunables 0 0 0 : slabdata 140 140 0
kmalloc-1k 1918 1936 1024 16 4 : tunables 0 0 0 : slabdata 121 121 0
kmalloc-512 25810 26336 512 16 2 : tunables 0 0 0 : slabdata 1646 1646 0
kmalloc-256 4132 4224 256 16 1 : tunables 0 0 0 : slabdata 264 264 0
kmalloc-192 5905 6153 192 21 1 : tunables 0 0 0 : slabdata 293 293 0
kmalloc-128 3232 3232 128 32 1 : tunables 0 0 0 : slabdata 101 101 0
kmalloc-96 3102 3318 96 42 1 : tunables 0 0 0 : slabdata 79 79 0
kmalloc-64 11132 11840 64 64 1 : tunables 0 0 0 : slabdata 185 185 0
kmalloc-32 41600 41600 32 128 1 : tunables 0 0 0 : slabdata 325 325 0
kmalloc-16 13824 13824 16 256 1 : tunables 0 0 0 : slabdata 54 54 0
kmalloc-8 10752 10752 8 512 1 : tunables 0 0 0 : slabdata 21 21 0
kmem_cache_node 192 192 64 64 1 : tunables 0 0 0 : slabdata 3 3 0
kmem_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周边激励大奖
以上是关于linux内核源码分析之slab的主要内容,如果未能解决你的问题,请参考以下文章