Linux内核内存管理算法Buddy和Slab

2023-11-19

Buddy分配器

假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框。这个时候,在这段内存上不能找到连续的5个空闲的页框,就会去另一段内存上去寻找5个连续的页框,这样子,久而久之就形成了页框的浪费。
在这里插入图片描述

为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍,如图:
在这里插入图片描述
假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。页框块在释放时,会主动将两个连续的页框块合并为一个较大的页框块

CMA

Buddy算法对内存拆拆合合的过程中会造成碎片化的现象,以至于内存后来没有了大块的连续内存,全是小块内存。

当然这对应用程序是不影响的(前面我们讲过用页表可以把不连续的物理地址在虚拟地址上连续起来),但是内核态就没有办法获取大块连续的内存(比如DMA, Camera, GPU都需要大块物理地址连续的内存)。

在嵌入式设备中一般用CMA来解决上述的问题。CMA的全称是contiguous memory allocator, 其工作原理是:预留一段的内存给驱动使用,但当驱动不用的时候,CMA区域可以分配给用户进程用作匿名内存或者页缓存。而当驱动需要使用时,就将进程占用的内存通过回收或者迁移的方式将之前占用的预留内存腾出来,供驱动使用。

Slab分配器

在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,那么分配一页的内存会造成内碎片。Slab分配器就应运而生了,专为小内存分配而生。slab分配器分配内存以Byte为单位。

在这里插入图片描述
kmem_cache是一个cache_chain的链表,描述了一个高速缓存,每个高速缓存包含了一个slabs的列表,这通常是一段连续的内存块。存在3种slab:

  • slabs_full(完全分配的slab)
  • slabs_partial(部分分配的slab)
  • slabs_empty(空slab,或者没有对象被分配)

slab是slab分配器的最小单位,在实现上一个slab有一个货多个连续的物理页组成(通常只有一页)。单个slab可以在slab链表之间移动,例如如果一个半满slab被分配了对象后变满了,就要从slabs_partial中被删除,同时插入到slabs_full中去。

总结

从内存DDR分为不同的ZONE,到CPU访问的Page通过页表来映射ZONE,再到通过Buddy算法和Slab算法对这些Page进行管理,我们应该可以从感官的角度理解了下图:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核内存管理算法Buddy和Slab 的相关文章

  • 编程技术面试的五大要点

    文 何海涛 扎实的基础知识 高质量的代码 清晰的思路 优化代码的能力 优秀的综合能力是编程技术面试的五大要点 找工作一直是一个热门话题 要想找到心仪的工作 难免需要经过多轮面试 编程面试是程序员面试过程中最为重要的一个环节 如果能在编程面试
  • 面试准备:Spring/Spring MVC常见面试题汇总

    文章目录 1 Spring框架有什么优点 2 什么是AOP 3 实现AOP的方式 AOP织入的三种时期 Spring AOP是怎么实现的 4 JDK动态代理实现方式 5 PageHelper实现方式 6 什么是IoC 什么是DI 7 Spr
  • 面试准备:Mybatis常见面试题汇总

    文章目录 1 和 的区别是什么 2 当实体类中的属性名和表中的字段名不一样 怎么办 3 模糊查询like语句该怎么写 4 Mybatis 一对一 一对多的xml怎么写 5 Dao 接口的工作原理是什么 Dao 接口里的方法 参数不同时 方法
  • 面试总结:测试常见面试题汇总

    文章目录 理论 测试流程 各个测试阶段 单元测试 集成测试 系统测试区别 测试用例设计 什么是好的测试用例 方法 用户登录 实例 App测试和Web测试的区别 典型测试场景 聊天功能测试用例怎么设计 怎么测试微信朋友圈 TODO 怎么测试微
  • 零拷贝的实现原理

    文章目录 引入 DMA PageCache 零拷贝 mmap sendfile SG DMA 使用零拷贝技术的项目 引入 在Java架构直通车 Kafka介绍和高性能原因一节中 介绍了Kafka的Zero Copy技术 本文将深入探究一下Z
  • 面试准备:Java新特性详解

    文章目录 Java语言新特性 1 Lambda表达式和函数式接口 2 接口的默认方法和静态方法 3 方法引用 4 重复注解 5 更好的类型推断 6 拓宽注解的应用场景 Java编译器新特性 参数名称 JVM的新特性 更多资料 参考 java
  • 面试准备:Java常见面试题汇总(一)

    面试准备 Java常见面试题汇总 一 面试准备 Java常见面试题汇总 二 面试准备 Java常见面试题汇总 三 文章目录 1 面向对象的特点 特性有哪些 补充 Java的多态是编译时多态还是运行时多态 2 接口和抽象类的相同点和不同点 3
  • 面试题目总结(CNN)

    CNN权值共享是什么 局部感知 即网络部分连通 每个神经元只与上一层的部分神经元相连 只感知局部 而不是整幅图像 滑窗实现 可行性 局部像素关系紧密 较远像素相关性弱 因此只需要局部感知 在更高层将局部的信息综合起来就得到了全局的信息 权值
  • Java架构直通车——以JDBC为例谈双亲委派模型的破坏

    文章目录 引入 JDBC4 0之前 JDBC4 0之后 引入 java给数据库操作提供了一个Driver接口 public interface Driver Connection connect String url java util P
  • 面试准备:Java常见面试题汇总(二)

    面试准备 Java常见面试题汇总 一 面试准备 Java常见面试题汇总 二 面试准备 Java常见面试题汇总 三 文章目录 43 java 中的 Math round 1 5 等于多少 44 String str abc 与 String
  • 处理器对原子操作的实现

    文章目录 引入 单核 多核 引入 原子操作对于我们来说 是非常熟悉的概念 从用户角度 可以用原子操作来替换重量级的锁同步 从而提高程序性能 底层实现角度 原子操作可以用于构建各种更重量级的同步操作 比如锁或屏障之类的 对于原子操作的实现来说
  • Java架构直通车——深入理解B+树

    文章目录 引入 AVL树和B树 AVL树 红黑树 B树 B 树 数据库为什么不使用二叉树 为什么使用B 树 与B树的区别 引入 AVL树和B树 AVL树 平衡二叉搜索树是基于二分法的策略提高数据的查找速度的二叉树的数据结构 平衡二叉搜索树的
  • 从头开始学Java——JVM虚拟机八问

    文章目录 什么是Java虚拟机 为什么Java被称为 平台无关的编程语言 什么是JIT HotSpot怎么工作的 HotSpot虚拟机要使用解释器与编译器并存的架构 什么是编译时 运行时 编译 运行 编译时运行时问题归纳 反射 描述Java
  • 招银网络科技电话面试

    1 关于项目的负责内容 还是非常有必要熟悉应急 天基的基础传输模块的 基本面试中都会觉得只界面模块很单薄 应急 基础传输模块 无人机网络协议 速率控制模块 界面模块 天基 基础传输模块 MRUDP 界面模块 2 TCP长连接 问 如何在TC
  • Java中数字的应用

    Java中数字的应用 在java中经常会遇到比较大的数 甚至超过了long型 那么该如何处理这些 大数据 呢 在java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类 从原则上是可以表示 天文单位 一样大的
  • 测开面经总结的经常考察的知识点

    一 算法相关 1 熟悉常见的排序算法 冒泡排序 插入排序 选择排序 归并排序 堆排序 快排 希尔排序 二 计算机网络相关 1 http协议 http 超文本传输协议 是一个在客户端和服务器端之间基于请求与响应模式的 无状态的 应用层的协议
  • 【动态规划】最长公共子序列和最长公共子串(python)

    编写用时 2020年3月12日12 02 28 1h 动态规划经典例题 最长公共子序列和最长公共子串 python 很久之前大概是高中的时候写过这种题目 使用动态规划的方法求解的 现读研究生了 要把过去的拾起来的呢 1 最长公共子序列 LC
  • C++面试题目集合(持续跟新)

    与我前面写的C语言进阶知识点遥相呼应 这才是C 面试 网上的面试题有些太简单了 C 面试题目最多集中在对象的内存模型 记住了 如果用c c 内存都不清楚 还写个屁的程序 1 C 的虚函数是怎样实现的 C 的虚函数使用了一个虚函数表来存放了每
  • C++实现String类

    C 实现String类 还没有完成 待继续 有以下注意的点 1 赋值操作符返回的是一个MyString 而重载的 返回的是一个MyString 其中的原因参看 effective c 主要是返回引用的时候 必须返回必须在此函数之前存在的引用
  • Linux内核内存管理算法Buddy和Slab

    文章目录 Buddy分配器 CMA Slab分配器 总结 Buddy分配器 假设这是一段连续的页框 阴影部分表示已经被使用的页框 现在需要申请一个连续的5个页框 这个时候 在这段内存上不能找到连续的5个空闲的页框 就会去另一段内存上去寻找5

随机推荐

  • 数据库架构设计思路、表结构设计方面思路

    介绍数据库设计 表结构设计 访问设计 物理存储设计 数据库设计思路 1 单机 单机就是把做的系统部署到一台服务器上 所有的请求业务都由这台服务器处理 显然 当业务增长到一定程度时 服务器的硬件会无法满足业务需求 2 集群 在多个服务器上部署
  • Qpython读取手机短信

    环境 手机RedMi Note 9 Pro 系统MIUI12 自带应用商店下载 QPython OP 在设置中要打开Qpython OP 的相关权限 否则会空指针 QPython OP 使用手册 读取短信代码如下 一个简单示例 from a
  • 几种Linux 查询外网出口IP的方法

    几种Linux 查询外网出口IP的方法 Curl 纯文本格式输出 curl icanhazip com curl ifconfig me curl curlmyip com curl ip appspot com curl ipinfo i
  • 【QrCode前端生成二维码】使用前端实现二维码

    遇到客户需求是扫码来替代人工输入一些数据 然后想着只从前端实现最好不过 然后就发现了qrCode这个js库 div div 可选参数来设置 var qrcode new QRCode test text http www qiuguodj
  • vue项目中批量删除如何实现的

    简单回答 与单个删除的接口为同一个 然后通过数组对象的id来删除
  • 光模块组装过程中常见问题分析及解决方法

    光模块组装过程中会出现一些问题 经常使用光模块的人可能会知道 下面就分享了组装光模块的问题及原因分析 并附有解决方案 大家参考下 希望对大家有帮助 在光模块组装过程中会出现一些问题 经常使用光模块的人可能会知道 组装光模块的问题 分析如下
  • 【嵌入式基础】串口中断通信VS串口DMA通信

    目录 目录 前言 一 串口通信 1 通信方式 2 通信速率 3 串口通信的三种工作方式 二 串口中断通信 1 串口中断特点 2 CubeMX配置初始化串口中断相关外设 3 串口中断程序分析 4 实验效果 三 串口DMA通信 1 关于DMA
  • 数字后端知识点扫盲——后端设计流程及使用工具

    1 DFT Design For Test 可测性设计 芯片每一步往往都自带测试电路 DFT的目的就是在设计的时候就考虑将来的测试 DFT的常见方法是 在设计中插入scan chain 将非扫描单元 如寄存器 变为扫描单元 DFT工具是sy
  • VS包含目录、库目录、附加依赖项、环境变量详解

    首先 提出一个问题 我们编译一个程序 都需要哪些文件 1 头文件 2 静态库lib 3 动态库dll 针对这三个文件 我们便可以设置工程的相关属性 1 头文件 我们要用到一个头文件 需要知道这个头文件的名字 然后用 include将它包含进
  • Java高级-包装类、BigDecimal和BigInteger

    基本数据类型和包装类 基本数据类型和包装类如下所示 基本类型 包装类 int java lang Integer 父类为java lang Number long java lang Long 父类为java lang Number dou
  • Maven中:可以被子模块继承的元素

    即使是长期从事 Maven 工作的开发人员也不能完全掌握聚合 多模块 和 Parent 继承的关系 在使用多模块时 子模块总要指定聚合的 pom 为
  • Linux中如何修改文件或目录的权限?

    在Linux系统中 文件权限是非常重要的一个概念 它能够决定谁可以访问文件 以及可以执行哪些操作 正确地设置文件权限可以确保系统的安全性和稳定性 那么如何设置文件权限呢 以下是详细的内容 在 Linux 系统中 可以使用 chmod 命令来
  • unity中的一些快捷键(齐)

    重命名的快捷键是F2 ALT 鼠标左键点击Hierarchy对象可以展开和收起对象的所有子物体 SHIFT 空格 可以对当前窗口进行放大缩小
  • 部署docker

    1 移除之前安装过的Docker sudo yum y remove docker docker client docker client latest docker common docker latest docker latest l
  • maven怎么引入jdom_如何在Maven项目中引入自己的jar包

    1 一般情况下jar包都可以使用pom xml来配置管理 但也有一些时候 我们项目中使用了一个内部jar文件 但是这个文件我们又没有开放到maven库中 我们会将文件放到我们项目中 以下以java工程为例随便放了个地方 2 jar包的引入和
  • RK3308 Ubuntu16.04移植

    一 概述 本章将介绍Ubuntu在RK平台上的移植以及AP配网 常用的fs为buildroot编译出来的linux文件系统 而本次则是ubuntu文件系统 系统启动后需要手动对WIFI驱动进行加载并配网 二 配置Kernel 为了支持ubu
  • python requests 爬虫--爬取HTML源码不显示正文已解决

    爬虫第一步 获取整个网页的HTML信息 源代码如下 coding UTF 8 import requests if name main target https www biqukan com 1 1094 5403177 html req
  • Wireshark过滤规则及使用方法

    前言 我看到的这篇文章是转载的 但我也不知道他是从哪转载的 o 转自 Wireshark 基本语法 基本使用方法 及包过滤规则 1 过滤IP 如来源IP或者目标IP等于某个IP 例子 ip src eq 192 168 1 107 or i
  • Java基础:常用类Compare

    Compare类 Comparable接口 自然排序 1 像String 包装类等实现了Comparable接口 重写了compareTo 方法 2 String 包装类重写了compareTo 方法后 进行了从小到大的排列 Test pu
  • Linux内核内存管理算法Buddy和Slab

    文章目录 Buddy分配器 CMA Slab分配器 总结 Buddy分配器 假设这是一段连续的页框 阴影部分表示已经被使用的页框 现在需要申请一个连续的5个页框 这个时候 在这段内存上不能找到连续的5个空闲的页框 就会去另一段内存上去寻找5