> 文档中心 > linux内核源码分析之slab

linux内核源码分析之slab

目录

概述

slab核心思想

kmem_cache结构

slab的结构

普通高速缓存和专用高速缓存


概述

        slab它是由Sun 公司的一个雇员Jeff Bonwick,在 Solaris 2.4 中设计并实现的 slab优点:

  1. 比页更小的内存对象
  2. 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 的负面影响逐级升高。

  1. 仍然处于CPU高速缓存中的per-CPU对象
  2. 现存slab中未使用的对象
  3. 刚使用伙伴系统分配的新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


linux内核源码分析之slab 创作打卡挑战赛 linux内核源码分析之slab 赢取流量/现金/CSDN周边激励大奖