LWN: 冻结page引用计数!

page _refcount和_mapcount字段 linux page有两个非常重要的引用计数字段_refcount和_mapcount,都是atomic_t类型,其中,_refcount表示内核中应用该page的次数。当_refcount = 0时,表示该page为空闲或者将要被释放。当_refcount > 0,表示该page页面已经被分配且内核正在使用,暂时不会被释放。 阅读详情

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

Freezing out the page reference count

By Jonathan Corbet
December 6, 2024
Gemini-1.5-flash translation
https://lwn.net/Articles/1000654/

`page` 结构体是内核内存管理子系统的核心(目前是这样),其关键部分是存储在 `refcount` 中的引用计数。页引用计数告诉内核给定页有多少用户以及何时可以释放它。但是,并非系统中的每个页都需要此计数。Matthew Wilcox 最近 重新启用 了一个 旧补丁集,该补丁集扩展了“冻结”页的概念——一个不具备有意义的引用计数的页——这立即对 slab 分配器有利,但也服务于一个长期的目标。

内核负责管理在多个用户之间共享的资源。例如,匿名(数据)页和文件支持页都可以映射到一个或多个进程的地址空间中;每个映射都会增加相关页的引用计数,确保该页在需要时一直存在。引用计数可以是管理对象生命周期的一种相对有效的方法,但它们不是免费的。频繁的引用计数更改会导致缓存行抖动,并且更改引用计数所需的原子操作相对昂贵。因此,当有机会时,/不/使用引用计数是有价值的。

在 `struct page` 引用计数的情况下,它的使用已深深植根于内存管理子系统中,以至于它几乎维护系统中的所有页——即使对于不需要它的那些页也是如此。一个特别的例子是 slab 分配器,它分配一组页,将它们分割成更小的对象,并在请求时分发这些对象。调用 `kmalloc()` 是从 slab 分配器获取内存的最常见方法。由于它必须跟踪包含在一个页中的每个子对象的状体,因此 slab 分配器知道该页整体上是否正在使用;它不需要为此目的使用单独的引用计数。

即便如此,给予 slab 分配器的页仍然是引用计数的。维护该引用计数的开销似乎并不多,但它会累加起来,尤其是在大量使用 slab 分配器的负载下。鉴于为获得即使是很小的收益所付出的努力,消除这种可能代价高昂的原子操作本身似乎就是一个值得追求的目标。

冻结页

Wilcox 的补丁集扩展了“冻结”页的概念——一个其引用计数已被冻结(值为零)且未使用的页。在当前内核中,冻结页仅用于 hugetlbfs 子系统,该子系统维护一组巨大的页供应用程序使用。在这种情况下,冻结页用于在组装更大的页时避免操作引用计数,但该概念更有广泛的用途。

在当前内核中,页的引用计数使用 `set_page_refcounted()` 调用进行初始化,该调用将计数设置为 1。此初始化是在页分配路径的深处完成的;整个内核中只有三个调用点。补丁集的大部分内容,也许令人惊讶的是,致力于添加更多这样的调用点。简而言之,`set_page_refcounted()` 调用被推送到低级分配函数的调用者的调用堆栈中。此更改使存在根本不设置引用计数的分配路径成为可能。尽管如此,这似乎是一个适得其反的改变;`set_page_refcounted()` 变成了一个单赋值指令(初始引用不需要原子操作),并且在更改之前代码可以说是更简洁的。然而,这样做是有原因的,我们将会看到。

一旦这些调用都被推送到堆栈底部,就会添加一个新的分配函数(实际上是一个宏):

struct page *alloc_frozen_pages(gfp_t gpf_flags, unsigned int order);

除此之外,现有的 `free_unref_page()` 被重命名为 `free_frozen_pages()`。在后一个函数中可以找到更大的节省。释放页的正常函数(`__free_pages()` 或其调用者之一)通过递减传递给它的页的引用计数来工作;只有当计数变为零时,它才会实际释放页。`free_frozen_pages()` 可以避免对引用计数进行原子递减和测试操作,因为它知道没有其他对该页的引用。

完成这项工作后,最后一步是 一个小补丁,它导致 slab 分配器使用 `alloc_frozen_pages()` 和 `free_frozen_pages()` 而不是 `alloc_pages()` 和 `__free_pages()`。不必要的原子操作被消除,并且 slab 分配器可能因此变得更快——尽管没有包含基准测试结果来量化这一点。

光辉的未来

性能补丁通常应该包含基准测试,但是这里的性能改进实际上更多的是一种副作用;推动这项工作的真正目的是不同的。自从几年前 folio 转变 开始以来,最终目标之一就是减小 `struct page` 的大小。这个结构体已经尽可能小了,但是由于系统中每个页都有一个这样的结构体,`page` 结构体最终仍然占据了系统中大约 1.5% 的内存。回收一些开销用于生产性用途是一个有吸引力的前景。

长远目标是将 `struct page` 缩减为单个 64 位 内存描述符,它指示每个页的使用方式,并包含一个指向包含该使用方式所需信息的结构体的指针。例如,slab 页可以使用 `struct slab` 来描述;该结构体存在于当前内核中,但被精心设计为 `struct page` 之上的一个覆盖层。在未来的世界中,单个 `struct slab` 可以存在于整个 folio 的 slab 页中,从而减少这些页的内存管理开销;一个指向该结构体的指针将被放置到每个相关的内存描述符中。

在当前内核中,`struct slab` 作为 `struct page` 的覆盖层,包含 `refcount` 字段;即使 Wilcox 的补丁集被合并,这也将保持不变。但是,在未来 `struct slab` 不再需要覆盖 `struct page` 的情况下,可以移除该引用计数,从而缩小 `struct slab` 的大小。这确实是 Wilcox 所展望的未来:

这个补丁集也是朝着光辉的未来迈出的一步,在这个未来中,`struct page` 没有引用计数;需要引用计数的用户将在他们的每个分配内存描述符中拥有一个。 (This patchset is also a step towards the Glorious Future in which struct page doesn't have a refcount; the users which need a refcount will have one in their per-allocation memdesc.)

许多朝着“光辉的未来”迈出的步骤已经采取;一些特定类型的内存描述符(例如 `struct slab`)已经合并,其他一些正在进行中。一直以来都在努力将信息从 `struct page` 移动到 `struct folio` 中(在适当的情况下)。其他项目,例如 从 `struct page` 中移除 `index` 成员,也在进行中。这个成员用于页面缓存页,它告诉内核它在磁盘上表示的文件中的偏移量;它正在转移到 `folio` 结构体中。这项工作反过来取决于正在进行中的 zswap 内存描述符转换。还有许多其他步骤有待采取,但是在这项工作结束时,`struct page` 应该大部分已经消失了。

因此,虽然从 slab 分配器的页释放路径中移除单个原子操作并不那么令人兴奋,但这组补丁作为更大的内存描述符项目中的一部分,则更有趣。内核内存管理子系统的核心正在经历一个激进的(且非常必要的)变革时期,这将使其在长期内变得更高效、更灵活和更易于维护,并且大多数用户甚至都没有注意到。这项任务有点像在摩天大楼保持营业的同时更换其地基;然而,在内核社区中,这只是平常的开发。

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

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

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

d47e95f9753c83e3c6c88754c19607d6.jpeg

linux内核之page数据结构 Linux内核的内存管理以page页面为核心,struct page数据结构提供了很多字段,其中_refcount和_mapcount是两个非常重要的引用计数,正确理解它们是理解Linux内核内存管理的基石。对于文件映射页面,mapping指向该文件所属的address_space结构,它包含文件所属的介质相关信息,如inode节点,节点对应操作方法等;对于PG_private页面,主要在块设备的buffer_head中使用,如buffer_migrate_page()会增加_refcount; 阅读详情

相关推荐

手把手教你使用HFSS仿真高速差分过孔—上

高速数字电路设计中,信号完整性是一个非常重要的问题。为了使信号保持良好的传输特性,PCB板上的互联线一般都采用均匀传输线,使互联线保持特性阻抗一致性,减少信号反射。然而PCB板上的互联线很多时候避免不了换层的问题,这时候就必须使用过孔。过孔会导致阻抗不连续,进而造成反射,出现信号完整性问题。         当信号传输速率越高,信号前沿越短的时候,过孔引入的信号完整性问题越严重,需要对过孔进行优

a2447944219的博客 2万+

struct page 中 refcount 与 mapcount成员含义的区别

refcount是页面拥有的引用总数,而_mapcount是引用页面的页表数。页表映射也是一个引用, 因此_mapcount中的计数也是_refcount的子集,即_refcount应该大于或等于_mapcount。,而在同一个进程中虚拟地址到物理地址的映射关系是唯一的一对,因此mapcount想说明的是 有多少个进程映射了这个物理页。比如在fork时,没有触发写操作之前,父子进程共享同一片虚拟地址空间,父子进程的页表PTE是一模一样的,指向同一片物理内存页。

weixin_46027808的博客 489

用python将dycom .dcm格式图像转换为nifti .nii

因为发现目前搜索到的多数中文教程并不能正确将FMRI图像正确转换,例如很多用simpleITk的seriesreader的,所以写了一下自己正确转换的方法。因为FMRI是一个4D数据,有时间轴,所以用seriesreader读写出来的图像把时间轴维度给降维了。当然你用SPM12工具的dycom import也是能正确转换的,但是我还是喜欢python这样的,代码直接简单。

qq_41103479的博客 3609

内核内存回收关键隐藏变量之page引用计数

page引用计数的增加与减少

dongzhiyan_hjp 2020

发那科机器人弧焊指令实战:从Search指令到组掩码设置的完整避坑指南

本文详细解析了发那科机器人弧焊指令系统的实战应用,从Search指令的正确使用到组掩码设置的避坑技巧。通过实际案例和参数优化建议,帮助工程师提升焊接质量和生产效率,避免常见错误操作。特别针对T2模式示教难题和外部轴协调运动提供了专业解决方案。

weixin_29040367的博客 184

YOLOv11缝合改进Conv | SAConv在YOLOv11中的应用可切换空洞卷积与性能提升(附代码)

在本篇文章中,我们将深入探讨如何通过引入**SAConv**(Switchable Atrous Convolution,可切换空洞卷积)来优化YOLOv11网络结构,特别是在卷积操作方面的创新。我们会解析SAConv的核心原理和架构设计。

一键难忘的博客 950

Linux内存管理 (11)page引用计数

https://www.cnblogs.com/arnoldlu/p/8335481.html 专题:Linux内存管理专题 关键词:struct page、_count、_mapcount、PG_locked/PG_referenced/PG_active/PG_dirty等。 Linux的内存管理是以页展开的,struct page非常重要,同时其维护成本也非常高。 这里主要介绍struct ...

hbcbgcx的博客 1275

【STM32实物】基于STM32设计的智能垃圾桶(语音、颜色识别、称重、光强、烟雾、人体识别、步进电机、水泵等)_资料编号25

基于STM32的语音识别垃圾桶系统以STM32F103C8T6为主控,采用18650可充放电锂电池组供电。硬件组成模块由5V步进电机马达与ULN2003驱动板、HX711压力传感器模块、DC5V水泵与MOSFET驱动板、0.96寸OLED显示屏、四个轻触按键、四个TCRT5000红外反射传感器、四个SG90舵机、SU-03T1语音模块、光敏电阻模块、MQ-2烟雾传感器模块、TCS34725颜色识别模块、蜂鸣器、LED灯构成。通过编写C语言软件程序,实现各硬件模块的协同工作。

嵌入式阿齐Archie 1万+

LWN:网络代码中着手处理冻结页!

包含在该向量中的所有页都需要在操作进行期间保持存在和有效,因此每个页的引用计数在开始时递增,并在操作完成后递减。然而,随着向 folios (更高级的页管理结构) 的转变以及避免不必要的引用计数操作的愿望,这种模式已经发生了变化。,在内存管理代码中添加了一些检查,以防止尝试操作 slab 页上的引用计数,slab 页是 6.14 内核中唯一的冻结页。随后进行了一些广泛的调试和讨论,最终弄清楚是网络代码试图对一个冻结页的引用计数进行递增操作,导致各种内部混乱,并最终导致崩溃。时,冻结页突然进入了人们的视野。

Linux News搬运工 1445

华为OD机试2025A卷 - BOSS的收入(Java & Python& JS & C++ & C )

华为OD机试2025A卷 - BOSS的收入(Jav一个XX产品行销总公司,只有一个boss,其有若干一级分销,一级分销又有若干二级分销,每个分销只有唯一的上级分销。规定,每个月,下级分销需要将自己的总收入(自己的+下级上交的)每满100元上交15元给自己的上级。现给出一组分销的关系,和每个分销的收入,请找出boss并计算出这个boss的收入。输入:分销关系和收入:[[分销id 上级分销id 收入], [分销id 上级分销id 收入], [分销id 上级分销id 收入]]输出:[boss的ID, 总收入]

算法大师! 1171

第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案

本文主要介绍了第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案,希望能对使用OpenClaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

LWN: 节省huge page场景下的struct page内存占用!

关注了就能看到更多这么棒的文章哦~Reducing page structures for huge pagesBy Jonathan CorbetDecember 11, 2020De...

Linux News搬运工 485

YOLOv11改进-卷积-引入小波卷积WTConv 解决多尺度小目标问题

1.首先,WTConv利用二维Haar小波变换对输入图像进行多级分解。低频分量 (LL):捕捉图像的低频信息,如整体形状或轮廓。水平高频分量 (LH):捕捉图像中的水平边缘信息。垂直高频分量 (HL):捕捉图像中的垂直边缘信息。对角线高频分量 (HH):捕捉图像的对角线细节。在每一级的小波变换中,图像被下采样(空间分辨率减半),但频率信息得到了更细的分解。递归地执行小波变换(称为多级分解)可以得到不同尺度下的频率分量。

qq_64693987的博客 1万+

LWN:允许其他CPU来清空此CPU的page list!

关注了就能看到更多这么棒的文章哦~Remote per-CPU page list drainingBy Jonathan CorbetFebruary 15, 2022DeepL ass...

Linux News搬运工 291

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LWN:改进page-fault的可扩展性!

关注了就能看到更多这么棒的文章哦~Improving page-fault scalabilityBy Jonathan CorbetMay 29, 2023LSFMM+BPFDeepL assisted translationhttps://lwn.net/Articles/932298/某些话题总是每年都要回到开发会议上来讨论一次,通常是因为开发人员仍在努力针对某个特定的问题寻找一个可行的解决...

Linux News搬运工 1164

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LWN:对user-space pages进行明确的pin操作!

关注了就能看到更多这么棒的文章哦~Explicit pinning of user-space pagesByJonathan CorbetDecember 13, 2019原文来自:...

Linux News搬运工 3177

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LWN:利用page folio来明确内存操作!

关注了就能看到更多这么棒的文章哦~Clarifying memory management with page foliosBy Jonathan CorbetMarch 18, 2021...

Linux News搬运工 2790

LWN:使用cachestat()来检查page-cache状态!

关注了就能看到更多这么棒的文章哦~Checking page-cache status with cachestat()By Jonathan CorbetDecember 6, 2022DeepL assisted translationhttps://lwn.net/Articles/917096/内核中的 page cache 会将文件的 page 保存在 RAM 中,让这些 page 可以...

Linux News搬运工 470

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

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

Linux News搬运工 447

LWN:拆分struct page的合适时机!

关注了就能看到更多这么棒的文章哦~The proper time to split struct pageBy Jonathan CorbetJuly 14, 2023ChatGPT assisted translationhttps://lwn.net/Articles/937839/页面结构(page struct)是内核内存管理子系统的核心组成部分;针对已安装上来的内存条中的每个 page ...

Linux News搬运工 1077

LWN:page在2024年的状况!

关注了就能看到更多这么棒的文章哦~The state of the page in 2024By Jonathan CorbetMay 15, 2024LSFMM+BPFChatGPT translationhttps://lwn.net/Articles/973565/引入folio结构来描述页面组,是近年来内核中最为基础的转变之一。由于 folio 转换工作影响到了许多子系统,因此在 2024...

Linux News搬运工 359

LWN:丢弃文件系统的page cache!

关注了就能看到更多这么棒的文章哦~Dropping the page cache for filesystemsBy Jake EdgeJune 11, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/977486/VFS 维护者 Christian Brauner 在 2024 年的Linux 存储、文件系统、...

Linux News搬运工 1687

LWN:folio的最新情况!

关注了就能看到更多这么棒的文章哦~A memory-folio updateBy Jonathan CorbetMay 4, 2022LSFMMDeepL assisted translationhttps://lwn.net/Articles/893512/folio 项目还不到两年,但它已经导致了对内核的内存管理以及文件系统层的重大改变。虽然已经做了很多工作,但仍有不...

Linux News搬运工 1448

LWN:回收未用的页表页的多种方法!

关注了就能看到更多这么棒的文章哦~Ways to reclaim unused page-table pagesBy Jonathan CorbetMay 9, 2022LSFMMDeepL assisted translationhttps://lwn.net/Articles/893726/内存管理子系统最重要的工作之一就是回收未使用(或很少使用)的内存,能够更好地利...

Linux News搬运工 332

LWN: 用DMEMFS来更高效地管理部分内存!

关注了就能看到更多这么棒的文章哦~Sidestepping kernel memory management with DMEMFSBy Jonathan CorbetDecember ...

Linux News搬运工 613

LWN:参与者共同记录page flags!

关注了就能看到更多这么棒的文章哦~Documenting page flags by committeeBy Jonathan CorbetMay 22, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/974515/对于系统中的每个内存页面(page),内核都会维护一组页面标志(page flag),描述页面的使...

Linux News搬运工 546
上一篇: LWN:自动对kernel进行调优!
下一篇: LWN:对2024所做预测的回顾!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值