48 slab 的实现

前言

这里说的是 内核中分配小对象的一种内存分配方式 slab 

呵呵 经典程度不必多说了, 内核使用的大多数数据结构 基本上是基于 slab 进行内存分配的 

这里 我们来看一下 slab 

如何分配对象  

几个分配层级, c->free_list, c->page, c->partial, new_slab 

1. 先来看一下走 new_slab 的流程 

如果尝试了 c->free_list, c->page, partial 之后都没有找到可用的 page, 那么会走 new_slab 来尝试分配新的物理页面, 这里的相关代码在 slub.allocate_slab

如下是 分配物理页 部分, 最终调用了 alloc_page, alloc_pages

然后之后 初始化 page 的 slab_cache, 初始化 freelist 为物理页 的虚拟地址

4f3df7f5b4b04ada88ef8e4fd3fa9e7e.png942c14e88070401cb8b734f73f4d23be.png

更新 kmem_cache_node 对应的统计信息

34035d7d76344b1497e22ed9e746c55a.png

然后 ___slab_alloc 是回到上面 new_slab_objects, 之后 更新 c->free_list, load_freelist

然后之后是 获取 free_list 返回, 并更新 c->free_list 为下一个空闲元素 

9309ab1730e9410e9a937aaf0661d268.pnga878cd5ff52d4546b23bef59bed8befe.png 

然后是走 后面的 slab_alloc_node 统一的一部分流程

8cd899b7b95c417987cc516105151bd0.png

2. 再来看一下走 partial 的流程 

取 partial 有几条路径, 如下这里是 取的 kmem_cache_cpu 中暂存的 partial, 然后之后 进行重试 

8e075bd190cb414dba3576d4076540fa.png

获取当前 kmem_cache_cpu 对应的 kmem_cache_node 维护的 partial 链表中获取一个可用的 page, 然后更新为 c->page, 返回 分配的对象

如果是 没有获取到空间, 则从所有的 kmem_cache_node 中尝试分配对象, 更新 c->page

56a1434d834f4d3eb49a7212f54d01f6.png

3. 再来看一下走 c->page 的流程 

这里是从 c->page 获取 free_list 的流程, 拿到 free_list 之后, 获取到空闲区间 分配对象, 然后走后面的 slab_alloc_node 统一的一部分流程

2eb5de7473dd45e5999746703fb88fb0.png

dc1d66ee1ee448f0865ab20d38e87111.png

根据 page 获取 free_list 的实现如下, cas 更新 page->free_list 为 null

获取的是 page 中暂存的 free_list

ae9977dc8d954ce98b667367f54ee27e.png

4. 再来看一下走 c->free_list 的流程, 这是 最 common 的场景 

取得是 c->free_list, 然后之后更新 c->free_list 为 next, next 是存在 next的s->offset偏移处 

687205ffecc746429517761b3e65e0a9.png

如何释放对象 

如果待释放的物理页和 kmem_cache_cpu 持有的物理页一致, 最 common 的场景 

cas 将 待释放对象添加到 c->free_list 所处的链表, 并更新 c->free_list 为 x 

5dda99bb5dfa4e329da0683723b030de.png

如果待释放的物理页和 kmem_cache_cpu 持有的物理页不一致 

cas 将 待释放对象添加到 c->free_list 所处的链表, 并更新 c->free_list 为 x 

如果当前页没有对象了, 并且 partial 的数量大于 kmem_cache 中约束的最小 partial 数量, 则从 partial, full 列表中移除当前页, 并且 更新 kmem_cache_node 的相关统计, free_pages 给定的物理页 

如果当前页 还有对象, 或者当前页需要保留

如果 当前物理页在释放对象之前已经占满, 则将当前 物理页添加到 partial 列表中

否则 直接返回 

9c0f316e49074091b29bdb0efb6a0190.png7d25523e372747a98838ad83481f98b0.png

0074ad3b8ef44724a52f1063bdc44564.png

d02e6fe8eba547e9aff81eb33e251a32.png

完 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/401445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#上位机与三菱PLC的通信08---开发自己的通讯库(A-1E版)

1、A-1E报文回顾 具体细节请看: C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析 C#上位机与三菱PLC的通信04--MC协议之A-1E报文测试 2、为何要开发自己的通讯库 前面使用了第3方的通讯库实现了与三菱PLC的通讯,实现了数据的读写,对于通…

Maven私服搭建Nexus3

第一部分:仓库部署 下载地址:https://help.sonatype.com/en/download.html 备用下载链接,部分已经失效了 解压后会有两个文件夹: nexus-3.20.1-01 sonatype-work 访问地址配置路径 \nexus-3.20.1-01\bin\nexus.vmoptions -Xms1…

Vue思维导图,复习+预习,其中有些已经弃用了,下期总结下

1、学前了解 2、基础知识 3、组件相关语法 4、高级语法 5、compositionAPI 6、配套工具

每日OJ题_二叉树dfs④_力扣98. 验证二叉搜索树

目录 力扣98. 验证二叉搜索树 解析代码 力扣98. 验证二叉搜索树 98. 验证二叉搜索树 难度 中等 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树…

C++动态分配内存知识点!

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好呀,又是分享干货的时间,今天我们来学习一下动态分配内存。 文章目录 1.动态分配内存的思想 2.动态分配内存的概念 2.1内存分配函数 2.2动态内存的申请和释放 2.3内存碎片问…

Android 面试问题 2024 版(其二)

Android 面试问题 2024 版(其二) 六、多线程和并发七、性能优化八、测试九、安全十、Material设计和 **UX/UI** 六、多线程和并发 Android 中的进程和线程有什么区别? 答:进程是在自己的内存空间中运行的应用程序的单独实例&…

使用JavaVisualVM排查FullGC问题

1.工具准备 在这里使用 jdk/bin 目录下的 jvisualvm.exe,是自带工具。 2.工具使用 将下载到本地的dump 文件导入工具中,会展示各个类的实例数占比,大小占比。 3.问题排查 前期准备 在分析dump文件之前,我们可以先观察应用中接…

06 flink 的各个角色的交互

前言 这里主要是 涉及到 flink 中各个角色的交互 TaskManager 和 ResourceManager 的交互 JobMaster 和 ResourceManager 的交互 等等流程 TaskManager 和 ResourceManager 的交互 主要是 包含了几个部分, 如下, 几个菜单 TaskManager向 ResourceManager 注册 Resou…

【Maven】介绍、下载及安装、集成IDEA

目录 一、什么是Maven Maven的作用 Maven模型 Maven仓库 二、下载及安装 三、IDEA集成Maven 1、POM配置详解 2、配置Maven环境 局部配置 全局设置 四、创建Maven项目 五、Maven坐标详解 六、导入Maven项目 方式1:使用Maven面板,快速导入项目 …

安装 Debian

安装 Debian 制作一个 Debian 的可启动 USB先决条件如何在 Linux 操作系统上制作 Debian 11 的可启动 USB第一步:附加 ISO 镜像第二步:选择 USB第三步:开始制作 USB 可启动的过程 如何在 Windows 上制作一个 Debian 11 可启动的 USB 盘第一步…

一周学会Django5 Python Web开发-Django5设置视图响应状态

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频,包括:2024版 Django5 Python we…

压缩感知(Compressed Sensing)的MATLAB仿真实现

在前一篇文章:正交匹配追踪(Orthogonal Matching Pursuit, OMP)的MATLAB实现中,我们介绍了针对稀疏信号进行压缩感知的MATLAB仿真。 本篇我们介绍一下针对的是原始的非稀疏信号,看看如何进行处理。 本文中,…

定制学习风格、满足多元需求:Mr. Ranedeer 帮你打造 AI 家教 | 开源日报 No.178

JushBJJ/Mr.-Ranedeer-AI-Tutor Stars: 20.4k License: NOASSERTION Mr. Ranedeer 是一个个性化的 AI 辅导项目,主要功能包括使用 GPT-4 生成定制化提示,为用户提供个性化学习体验。其核心优势和特点包括: 调整知识深度以满足学习需求定制学…

原生 复选框 input[type=“checkbox“] 样式修改

样式: input[type"checkbox"] {position: relative;width: 25px;height: 25px;/* 用于控制 UI 控件的基于操作系统主题的原生外观。none 隐藏部件的某些特性 */appearance: none; }input[type"checkbox"]::before {content: "";posi…

采用uniapp实现的银行卡卡片, 支持H5和微信小程序

采用uniapp-vue3实现的银行卡卡片 支持H5、微信小程序(其他小程序未测试过,可自行尝试) 可用于参考学习 可到插件市场下载尝试: https://ext.dcloud.net.cn/plugin?id16736 使用示例

ansible的剧本

1 playbook 剧本 1.1 playbooks的组成 Tasks 任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 Variables 变量 Templates 模板 Handlers 处理器,当changed状态条件满足时,(notify&#xff09…

“TypeError: utils request jS WEBPACK IMPORTED MODULE O .default is undefined‘报错

写项目时报下列错误,找了半天,结果才发现自己在request.js中少写了一行代码 一定不要少些代码 export default requestrequest.js完整代码 import axios from axios;//创建一个新的axios对象 const request axios.create({baseURL:http://localhost:…

AIDL的工作原理与使用示例 跨进程通信 远程方法调用RPC

AIDL的介绍与使用 AIDL(Android Interface Definition Language)是Android中用于定义客户端和服务端之间通信接口的一种接口定义语言。它允许你定义客户端和服务的通信协议,用于在不同的进程间或同一进程的不同组件间进行数据传递。AIDL通过…

SpringCloud Ribbon负载均衡的策略总结及其配置

1. 轮询策略 2. 权重轮询策略 3. 随机策略 4. 最少并发数策略 5. 在选定的负载均衡策略基础上重试机制 6. 可用性敏感策略。 7. 区域敏感策略 —————————————————————— Ribbon负载均衡策略的配置: 在application.yml中配置如下&am…

功能问题:如何开发一个自己的 VS Code 插件?

大家好,我是大澈! 本文约1100字,整篇阅读大约需要3分钟。 感谢关注微信公众号:“程序员大澈”,免费领取"面试礼包"一份,然后免费加入问答群,从此让解决问题的你不再孤单&#xff01…