LWN:SLUB分配器的下一步计划!

Linux内核源码目录结构解析:从宏观布局到高效阅读指南 操作系统内核是计算机系统的核心,负责管理硬件资源并为应用程序提供基础服务。其设计遵循模块化与层次化原则,通过清晰的接口定义实现各子系统间的解耦与协作,从而提升系统的可维护性与可扩展性。这一设计理念在工程实践中的直接体现,便是其源码的目录组织结构。理解内核源码目录,如同掌握一张精密的地图,能帮助开发者在进行驱动开发、性能调优或问题排查时,快速定位目标代码,厘清模块间的依赖与调用关系。本文将以Linux内核为例,深入剖析其源码树的宏观布局与设计哲学,并重点解读 arch(架构相关代码)、drivers(设备驱动 阅读详情

关注了就能看到更多这么棒的文章哦~

What's next for the SLUB allocator

By Jonathan Corbet
May 20, 2024
LSFMM+BPF
Gemini-1.5-flash translation
https://lwn.net/Articles/974138/

Linux 内核中存在两个级别的基本内存分配器:页分配器 (page allocator),以页为单位分配内存;以及 slab 分配器 (slab allocator),分配任意大小的块,通常(但不一定)小于一个页。slab 分配器是内核中常用函数 kmalloc() 的底层实现。在 2024 年 Linux 存储、文件系统、内存管理和 BPF 峰会 上,slab 维护者 Vlastimil Babka 对 slab 级别最近的变动进行了介绍,并讨论了即将到来的变动。

曾经,内核包含三个 slab 分配器实现。在 6.4 版本中,这个数字降至两个,当时 SLOB 分配器(针对低内存系统)被移除。Babka 在 2023 年峰会 上表示,当时已经决定移除 SLAB(两个通用分配器之一),只保留 SLUB 在内核中。这个移除动作也在 6.8 版本中完成。内核开发者现在拥有更大的自由度来改进 SLUB,而不必担心破坏其他分配器。他认为没有人对这个移除动作感到不满,直到他看到了最近来自嵌入式开源峰会的 报告,其中包含了一些抱怨。即使在那个场合里,主要抱怨似乎是关于移除发生得太快了的——尽管他认为这已经拖延了太久。无论如何,似乎没有人强烈要求将 SLAB 重新加入内核。

b513c8a748db1266beccd8607e872f74.png

去年,一些人表达了 SLUB 比 SLAB 对于某些工作负载更慢的担忧。但现在,没有人致力于解决任何剩余的问题。David Rientjes 说 Google 仍在努力过渡到 SLUB;在这个过程中,他们发现使用 SLUB 解决了一些在使用 SLAB 时观察到的抖动问题,因此 Google 的开发人员对这次变更感到满意。

Babka 说他一直在努力减少控制组中内核内存分配的统计(accounting)所产生的开销;这种成本体现在微基准测试(microbenchmarks)中,并且“Linus 对此很不满”。有一些改进已准备好在 6.10 版本中实现,但还有更多工作要做。slab 开发的另一个领域是 堆喷射防御(heap-spraying defense);这些补丁对他来说有点问题。他可以将它们视为内存管理变更进行审查,但他缺乏对安全方面进行判断所需的专业知识。

目前正在进行有关对象缓存和预填充的工作。这项功能将维护一个 per-CPU 的对象数组,用户可以选择是否打开这个功能;他们将能够在分配之前对对象进行预填充(或者预分配),以便它们在需要时随时可用。例如这对于在临界区中分配的对象非常有用。最初的目标用户是 maple tree 数据结构,它目前在进入临界区之前批量分配最坏情况下的对象数量,然后在之后返回未使用的对象。对象缓存将消除这种来回操作,同时确保在需要时可以分配对象。

Michal Hocko 指出,推动这项功能的真正问题是 GFP_ATOMIC 分配与 __GFP_NOFAIL 标志组合起来的情况;如果内存紧张,内核很难满足这种组合。分配器目前在遇到这种组合时会发出警告;他表示,开发者应尽量避免使用这种组合。预填充的对象缓存是解决这个问题的一种方法。将来,可能会为这种情况添加某种预留机制。

maple tree 暴露的另一个问题与其使用 kfree_rcu() 释放对象的做法有关——这在内核代码中经常使用。问题在于,以这种方式释放的内存不会立即供其他用途使用;它必须首先等待 RCU 优雅期过去。这会导致 kfree_rcu() 使用的 per-CPU 数组溢出,导致刷新(flushing),并且可能导致很快就需要重新填充进来,从而再次启动这个循环。这个问题在 Android 上更加严重,RCU 回调只在某些 CPU 上运行,这对处理未运行回调的 CPU 上的 per-CPU 数组就完全没有作用了。

计划创建一个 kfree_rcu() 变体,将对象放入数组并将其放在一边,以便作为一个整体释放。一旦发生这种情况,整个数组就可以放回池中,并提供给所有 CPU 使用。这个数组将被称为“sheaf”;它将存储在每个节点的“barn”中。一个潜在的问题是,在释放对象时可能需要分配一个新的 sheaf;应尽可能避免在释放路径中进行分配。该小组讨论了替代方案,但没有得出任何结论。

与此同时,Babka 并不满足于只移除 SLOB 和 SLAB;接下来要移除的目标是 BPF 子系统使用的特殊分配器。这个分配器旨在任何调用上下文内都可以使用,包括不可屏蔽中断 (NMI) 场景中。BPF 维护者 Alexei Starovoitov 显然赞成进行这个移除,如果 SLUB 能够处理相同的用例的话。BPF 分配器目前为分配的对象添加了 llist_node 结构,使它们更大;切换到 SLUB 将消除这种开销。这也将使 SLUB 成为 NMI 安全的,并消除维护另一个分配器的必要性。

Babka 还希望集成 objpool 分配器,该分配器在 6.7 内核中添加,没有与内存管理开发者进行任何协商。最后,随着会议时间的结束,Babka 提到了最终集成 mempool 子系统(这是另一种预分配对象的方式)的可能性。SLUB 分配器可以为系统中的所有 mempool 预留对象,从而减少整体开销。不过,这看起来是 2025 年峰会讨论的话题。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

04c1768a1b4da99054d7b92d64dd2deb.jpeg

VLOOKUP_fixed.py 立即下载

相关推荐

D打卡签到,蓝牙中继,广播信号模拟器

模拟WIFI或蓝牙,有如下4种运行模式 1、WIFI模式:指定SSID、BSSID名称等,模拟WIFI,供设备连接。 2、蓝牙静态模式:指定MAC地址,广播固定的RAW数据。 3、蓝牙动态主机模式:扫描周围蓝牙设备,获取指定MAC地址的蓝牙及其RAW数据,实时发送至Cloud云端,可以设定时间段,只在设定的时间段内发送。 4、蓝牙动态从机模式:指定MAC地址,从Cloud云端获取动态主机模式实时上传的该MAC地址的RAW数据,并广播RAW数据。 准备工作: 1、板子:选择ESP32C3或ESP32C3 Supermini 2、nRF Connect手机app:用于扫描获取待模拟蓝牙设备的MAC和RAW数据。 Wifi分析仪或WiFi魔盒手机APP:用于扫描获取待模拟WIFI设备的SSID和BSSID。 3、可使用官方flash_download_tool_3.9.11工具来固件烧录。 使用说明: 上述完成后,设备首次上电,RESET一侧的指示灯会常亮,可以把它理解成电源指示灯; BOOT一侧的灯会亮,该灯常亮,表示设备开启了AP模式,此时设备会发射一个WIFI信号源,名称为ESPWIFI_AP,密码为12345678,手机或电脑连接该WIFI,浏览器输入192.168.4.1,进入设备的配置页面,进行相应的配置,其中动态主机模式和动态从机模式的SSID、Pwd 及要模拟的蓝牙MAC地址。配置完成并保存后,会重启,重启后设备会按照保存的配置运行。若下次要修改设备配置,可以长按BOOT按键,等待BOOT一侧的灯常亮,即进入AP模式,再按照上述流程配置即可。 仅用于蓝牙设备的开发与调试,请勿用于签到等违法违纪用途。

LWN:给kernel的swap添加一个抽象层!

关注了就能看到更多这么棒的文章哦~A new swap abstraction layer for the kernelBy Jonathan CorbetMay 23, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/974587/交换(swapping)在本质上可能是一种内存管理技术,但其实现也涉及内核的文件系...

Linux News搬运工 698

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

LWN:把slab从struct page中移出来!

关注了就能看到更多这么棒的文章哦~Pulling slabs out of struct pageBy Jonathan CorbetOctober 8, 2021DeepL assist...

Linux News搬运工 447

企业级AI助手平台 开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力 支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化

企业级AI应用开发框架,支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化能力,提供可视化流程编排、自主决策智能体与多智能体协同调度,兼容主流 Agent Skill 协议,帮助企业与开发者零门槛快速构建安全、高效、可落地的AI智能体应用与行业解决方案。

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型等

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 Spring Boot, MyBatis, Flowable, TypeScript, Vue, Antdv, 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型、代码生成器等

LWN:slab 分配器的sheaves以及任意上下文的分配功能!

总而言之,他说,来自 sheaves 层的初步结果是 promising(很有希望的),但它与 slab 调试的交互需要改进。(它是 slab 分配器的一部分)实现的工作会议,该版本期望可以从任何上下文中的 BPF 程序中调用。Hoang Nhat Pham 同意,他说他工作的系统具有大量的 CPU,但只有一个 NUMA 节点,从而导致大量的锁竞争,而 per-CPU 缓存可以改善这种情况。最后一个特性几乎是没有额外代价的,因为幸运的是,当请求到达时,分配器会有一个具有足够对象的 sheaf 存在。

Linux News搬运工 1708

基于动态窗口法DWA的机器人路径规划研究(Matlab代码实现)

内容概要:本文系统研究了基于动态窗口法(DWA)的机器人局部路径规划算法,深入剖析其在动态环境中实现自主避障与实时轨迹优化的核心机制。文章详细阐述了DWA算法的速度空间采样策略、轨迹预测模型、动力学约束处理及多目标代价函数的设计原理,并通过构建完整的Matlab仿真框架验证算法有效性。结合典型场景的仿真实验,展示了机器人在复杂障碍物环境下如何实时生成安全、平滑且符合运动学约束的最优路径,充分体现了DWA在移动机器人导航中的实用性与鲁棒性。; 适合人群:具备机器人运动规划基础知识和Matlab编程能力,从事智能移动机器人、自动驾驶或服务机器人研发的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解DWA算法的理论基础与实现细节;②掌握机器人局部路径规划的仿真实现方法;③为实际机器人系统的导航模块开发提供可复用的算法原型与代码参考;④作为进一步研究高级导航算法(如TEB、MPC)的技术基础。; 阅读建议:建议结合提供的Matlab代码逐模块分析与调试,重点关注速度采样、轨迹积分、障碍物距离计算及代价评估等关键环节,通过调整参数在不同地图环境中进行对比实验,以深刻把握算法性能与参数之间的关系,进而提升对实时路径规划系统设计的理解与应用能力。

Linux 移除slob、slab,只保留slub

SLOB:已在Linux 6.4中移除。SLAB:已在Linux 6.8中移除。

weixin_43551095的博客 200

【轴承故障诊断】用于轴承故障诊断的集中时频分析研究(Matlab代码实现)

内容概要:本文系统研究了用于轴承故障诊断的集中时频分析技术,重点解决了传统时频分析方法在处理非平稳信号时存在的能量分散与分辨率不足等问题。通过引入集中时频分析方法,能够有效聚焦信号能量,精确提取轴承故障特征频率,提升故障识别的准确性与时效性。文章详细阐述了该方法的理论基础,并结合仿真信号与实际实验数据验证其优越性能,同时提供了完整的Matlab代码实现流程,涵盖信号预处理、时频变换、参数优化及结果可视化等环节,便于读者复现与拓展应用。; 适合人群:具备一定信号处理理论基础和Matlab编程能力的研究生、科研人员,以及从事机械设备状态监测、故障诊断与预测性维护工作的工程技术人员。; 使用场景及目标:①应用于电机、风机、齿轮箱等旋转机械的早期轴承故障检测,实现故障预警;②提升工业设备运维系统的智能化水平,支撑预测性维护体系构建;③作为高校或研究机构在信号处理、机械故障诊断等课程中的教学案例与实践素材。; 阅读建议:建议读者结合文中提供的Matlab代码逐段运行与调试,深入理解集中时频分布的生成机制及其关键参数(如核函数选择、平滑窗口大小)对诊断效果的影响,并尝试将其应用于其他类型的机械故障信号分析中,开展对比研究以深化对该方法适用性的认识。

从零玩转GD32单片机CAN总线:手把手实战配置与源码解析

本文提供了一份基于GD32单片机的CAN总线实战入门指南。从硬件连接(GD32F103C8T6与TJA1050收发器)到软件配置,详细解析了CAN初始化、波特率计算、过滤器设置及中断收发等核心源码。通过手把手的回环测试示例与常见问题排查,帮助开发者快速掌握CAN总线通信的关键配置与调试技巧。

g5h6i7j的博客 481

LWN: 确保kmalloc()分配是对齐的

Implementing alignment guarantees for kmalloc()October 18, 2019This article was contributed by Marta Rybczyńskakmalloc()是kernel中经常用到的针对小块目标进行内存分配的函数。在2019 Linux Storage, Filesystem, and Memory Managem...

Linux News搬运工 855

π_RL:解锁流匹配VLA强化学习后训练的关键技术与实战解析

本文深入解析了π_RL框架如何通过流匹配(flow matching)与强化学习(RL)的结合,解决视觉语言动作模型(VLA)在后训练中的关键挑战。详细介绍了Flow Noise和Flow SDE两大核心技术,以及它们在机器人控制任务中的实战效果,显著提升了模型的性能、数据效率和泛化能力。

weixin_29061531的博客 220

LWN: kmalloc( )确保对齐

点击上方蓝色字关注我们~Alignment guarantees for kmalloc()ByJonathan CorbetMay 8, 2019LSFMMkmall...

Linux News搬运工 1622

在macOS上使用GitHub的超详细指南

GitHub:免费的远程仓库,可用来托管自己的开源项目。它利用了Git强大的克隆和分支功能,让我们参与别人的开源项目和让别人参与自己的开源项目变得简单高效。

Mars的博客 3391

Chromium实用技巧篇-如何下载指定版本的Chromium(一)

通过本指南,您已成功掌握如何在Windows系统上下载并安装最新版本的Chromium浏览器。我们详细介绍了从进入Chromium官网,到查找最新版本号,再到下载和安装的每一个步骤。通过这些步骤,您不仅能够体验到最新的浏览器功能,还可以参与开源项目的开发,享受高速、稳定、安全的浏览体验。

守城小轩的技术窝棚 1万+

LWN:Slabs, sheaves, and barns!

关注了就能看到更多这么棒的文章哦~Slabs, sheaves, and barnsBy Jonathan CorbetFebruary 24, 2025Gemini-1.5-flash translationhttps://lwn.net/Articles/1010667/内核的 slab (slab:一种内存分配机制)分配器负责分配小的(通常小于一个内存页)内存块。对于许多工作负载来说,对象分...

Linux News搬运工 1041

GEE案例:计算区域生态总体脆弱性分析

计算区域生态总体脆弱性分析需要考虑多个指标和因素。下面是一个基本的方法:选择指标:选择一组能够反映区域生态系统脆弱性的指标。这些指标可以包括生物多样性指数、森林覆盖率、湿地保护率、土地退化程度等。为每个指标分配权重:为了使得各指标在计算中的重要性相对均衡,可以为每个指标分配一个权重。权重可以根据各指标的重要性和可利用的数据进行确定。数据收集和处理:收集每个指标的数据,并对其进行处理,确保数据的准确性和一致性。如果有需要,可以对数据进行归一化处理。计算指标值:根据收集的数据和权重,计算每个指标的值。

此星光明博客 465

LWN:5.17 中的struct slab!

关注了就能看到更多这么棒的文章哦~Struct slab comes to 5.17By Jonathan CorbetJanuary 14, 2022DeepL assisted tra...

Linux News搬运工 455

如何学习总线技术

如何学习总线技术 以形象生动的比喻来描绘了总线技术的基本思想,指出了总线的基本分类和总线传输的基本原理,以及在学习过程中应当掌握的最基本的知识,对初学者有起到抛砖引入的作用。 0引言   如果一座只能容一个人来往的独木桥,两端的人都想要过桥,为了不拥挤、阻塞,那我们就得采取有效的办法。比如规定某段时间哪端的人过桥,另一端的人就等着该他过桥的时间段的到来,同时也还可以规定人多时要按先来后到或年

ce123的技术博客 8527

【LOGO动态替换】记录一次关于LOGO动态替换引发的uboot代码分析及其实现

文章目录1.前言2.实现2.1 新增logo分区2.2 制作logo分区镜像2.2.1 查看logo.bmp和logo_kernel.bmp的文件大小。2.2.2 按规则将bmp写入logo.img3.分析3.1 uboot的启动分析3.2 uboot bmp load 显示部分3.2.1 rockchip_show_logo3.2.2 load_bmp_logo3.2.3 load_bmp_logo3.3 uboot bmp read部分3.3.1 read_logo_bmps3.3.1 read_bmp

wang 恒 的博客 1212

LWN:5.16 合并窗口,第二部分!

关注了就能看到更多这么棒的文章哦~5.16 Merge window, part 2By Jonathan CorbetNovember 15, 2021DeepL assisted tr...

Linux News搬运工 457

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

AI 辅助读 Linux 内核,事实检索和推理要分开

阅读 Linux 内核内存管理代码,通常要跨文件追踪调用、宏与条件编译。把这些事实全部交给模型从记忆里补齐,很容易混入其他内核版本的实现。越来越多的团队尝试引入大模型与 AI Agent 来辅助阅读与分析内核源码。然而如果直接把几千行内核代码输入给 LLM,往往容易遇到偏差:大模型可能在宏定义替换上产生理解偏差,将不同内核版本的机制混淆;或者因超出上下文窗口(Context Window)而忽略关键的内存释放路径。要让 AI 成为内核分析的辅助工具,关键在于厘清与。

jiang_style的博客 5066

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

向struct page里塞更多东西

翻译并篡改更新自LWN.NET 2013年8月的一篇文章。 通常,内核开发人员更倾向于设计可读性和可维护性高的数据结构。当人们理解一段代码使用的数据结构时,对代码本身的理解通常就不会遥远。因此,内核使用最频繁的数据结构之一也是其可理解性最差的之一,这个事实可能会令人惊讶。这个数据结构就是struct page,代表物理内存的页面。最近的一个补丁集,使struct page更加复杂,当然,这也为快...

ytfy339784578的专栏 410

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linux内核学习1--开始

实践和反复实验也是提高驱动开发能力的关键。- **内核内存分配**:学习如何在内核中使用`kmalloc`、`kfree`、`vmalloc`等函数分配和释放内存,以及如何管理内核的内存资源。- **字符设备文件操作**:了解如何实现`open`、`read`、`write`、`ioctl`等系统调用函数,并将其挂钩到字符设备驱动中。- **调试工具**:学习使用`printk`、`dmesg`、`debugfs`等工具输出调试信息,以及如何使用`gdb`调试内核模块。

fanged的专栏 1136
上一篇: LWN:6.10 合并窗口前半部分!
下一篇: LWN:Trinity 保持KDE 3!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值