当前位置: 首页 > news >正文

slab分配器

一、slab分配器的由来

在Linux中,伙伴分配器(buddy allocator)是以页为单位管理和分配内存。但在内核中的需求却以字节为单位(在内核中面临频繁的结构体内存分配问题)。假如我们需要动态申请一个内核结构体(占 20 字节),若仍然分配一页内存,这将严重浪费内存。那么该如何分配呢?slab 分配器应运而生。slab分配器分配内存以字节为单位,基于伙伴分配器的大内存进一步细分成小内存分配。

Linux 系统中关于 slab 对象池的有三种实现:slab,slub,slob。

其中 slab 的实现,最早是由 Sun 公司的 Jeff Bonwick 大神在 Solaris 2.4 系统中设计并实现的,由于 Jeff Bonwick 大神公开了 slab 的实现方法,因此被 Linux 所借鉴并于 1996 年在 Linux 2.0 版本中引入了 slab,用于 Linux 内核早期的小内存分配场景。

由于 slab 的实现非常复杂,slab 中拥有多种存储对象的队列,队列管理开销比较大,slab 元数据比较臃肿,对 NUMA 架构的支持臃肿繁杂(slab 引入时内核还没支持 NUMA),这样导致 slab 内部为了维护这些自身元数据管理结构就得花费大量的内存空间,这在配置有超大容量内存的服务器上,内存的浪费是非常可观的。

针对以上 slab 的不足,内核大神 Christoph Lameter 在 2.6.22 版本(2007 年发布)中引入了新的 slub 实现。slub 简化了 slab 一些复杂的设计,同时保留了 slab 的基本思想,摒弃了 slab 众多管理队列的概念,并针对多处理器,NUMA 架构进行优化,放弃了效果不太明显的 slab 着色机制。slub 与 slab 相比,提高了性能,吞吐量,并降低了内存的浪费。成为现在内核中常用的 slab 实现。

而 slob 的实现是在内核 2.6.16 版本(2006 年发布)引入的,它是专门为嵌入式小型机器小内存的场景设计的,所以实现上很精简,能在小型机器上提供很不错的性能。

而内核中关于内存池(小内存分配器)的相关 API 接口函数均是以 slab 命名的,但是我们可以通过配置的方式来平滑切换以上三种 slab 的实现。

 

二、slab分配器的基本原理

slab 首先会向伙伴系统一次性申请一个或者多个物理内存页面,正是这些物理内存页组成了 slab 内存池(kmem_cache)。随后 slab 内存池会将这些连续的物理内存页面划分成多个大小相同的小内存块(object)出来,同一种 slab 内存池下,划分出来的小内存块尺寸是一样的。内核会针对不同尺寸的小内存分配需求,预先创建出多个 slab 内存池出来。

这种小内存在内核中的使用场景非常之多,比如,内核中那些经常使用,需要频繁申请释放的一些核心数据结构对象:task_struct 对象,mm_struct 对象,struct page 对象,struct file 对象,socket 对象等。

而创建这些内核核心数据结构对象以及为这些核心对象分配内存,销毁这些内核对象以及释放相关的内存是需要性能开销的。

 slab分配器将释放的内存块保存在一个内部列表中. 并不马上返回给伙伴系统. 在请求为该类对象分配一个新实例时, 会使用最近释放的内存块。这有两个优点. 首先, 由于内核不必使用伙伴系统算法, 处理时间会变短. 其次, 由于该内存块仍然是”新”的,因此其仍然驻留在CPU硬件缓存的概率较高.

object对象是slub分配器内存分配的最小单元。

object对象的格式如下:

slab缓存池object对象大小固定为size,一个object对象由:

red left pad,object内存区域,red zone,freepinter,track,padding等部分组成。

通过object对象freepointer指针将slab缓存池所有object对象进行连接。

ref;

细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现 - bin的技术小屋 - 博客园

图解slub

深入理解 slab cache 内存分配全链路实现 - bin的技术小屋 - 博客园

https://freegeektime.com/100078401/389880/

内存管理---Slab原理分析_slab大小-CSDN博客

Linux 内核 | 内存管理——Slab 分配器 - 一丁点儿的网络日志

图解Linux内存管理_slab,slub,slob分配器 - 哔哩哔哩


http://www.mrgr.cn/news/77766.html

相关文章:

  • Open FPV VTX开源之第一次出图
  • Cygwin, MinGW
  • Java实用办公小程序
  • Linux的各种初始化注册方法
  • MySQL 视图 存储过程与存储函数
  • python 生成24bit音频数据实例解析
  • 游戏引擎学习第20天
  • RTPS通信使用的socket和端口
  • Linux各种并发服务器优缺点
  • 12 —— Webpack中向前端注入环境变量
  • 2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略(详细解题思路)
  • IDEA算法的详细介绍及Python实现
  • 2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 (python 代码+matlab代码)
  • 乐理的学习(和弦)
  • c++11的动态类型
  • 二叉树相关OJ题练习
  • 2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 完整参考论文(1)
  • DrissionPage爬虫工具教程
  • Node基本使用
  • java学习记录12
  • <OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools
  • 项目实践----springboot中设计基于Redisson的分布式锁注解
  • 实用功能,觊觎(Edge)浏览器的内置截(长)图功能
  • oracle排查长时间没提交的事务造成的阻塞案例
  • Spring循环依赖如何解决的?
  • Pytorch使用手册-Datasets DataLoaders(专题三)