LWN:madvise()只能对本进程做,没想过控制别的进程吗?

【内核篇】1.Android 内核配置信息 基于kernel/configs/q/android-4.19/android-base.config 阅读详情
640点击上方蓝色字关注我们~



New system calls for memory management

By Jonathan Corbet
May 24, 2019


社区提出一些新的system call,希望能加入后续kernel版本里。其中一部分是专门用于内存管理进程的。下面会介绍用于进程间zero copy的process_vm_mmap(),还有两个新的API用于通知kernel更改其他进程里的内存处理策略的。


process_vm_mmap()

很多情况下需要快速把数据从一个进程搬到另一个进程去,例如消息传递的应用程序都是如此,这样的例子非常多。在Linux 3.2开发周期里已经加入了一对专门为这种情况定制的system call,不过目前知道的人还不多。


这两个syscall都会把当前进程地址空间(参数lvec数组)的数据复制到对方进程空间(参数rvec),他们实现了不经过kernel space来做跨进程的数据搬移。对某些特定场景下,这两个API会非常高效,不过有一些例外情况,特别是需要复制的数据如果特别多的情况下。


Kirill Tkhai提交了一组patch set,其中最开始他就描述了一些用这两个API碰到的问题:做copy时必须要真正做数据传递,且要能访问到所有数据。如果要复制的数据碰巧被换出了(swapped out),就会被自动换入回RAM。对copy的目标地址也是一样的道理,此外,目标地址空间如果尚未分配过真正的page的话,那么就需要先分配内存来放置这份copy的数据。最终所有数据都要从CPU这边绕一道,会把CPU本地cache里的其他有用数据都挤没了。具体出现的现象是:在线迁移很大的container(容器)的时候,每当container的空间加倍的时候,迁移时间会增大100倍。整个系统都会被大量的IO操作拖累,很多有价值的CPU cache内容都不再驻留在cache里了。


Tkhai提出的方案是引入一个新的system call,避免数据的copy:


    int process_vm_mmap(pid_t pid, unsigned long src_addr, unsigned long len,
unsigned long dst_addr, unsigned long flags);

这个函数很像mmap(),会在dst_addr(目标地址空间)位置,以len长度先在调用者进程的内存空间里创建一个新的内存映射(memory mapping),最终数据内容就是pid指定的进程空间里src_addr位置的数据。API包含若干flag:PVMMAP_FIXED说明是精确地址;PVMMAP_FIXED_NOREPLACE则要求避免这个特定的地址映射替换了此地址原有的的地址映射。


最终这个函数的效果很像process_vm_readv(),不过他们的区别是:新函数并不会复制所有数据到目标地址,而是把源进程的页表项复制过去,事实上只是对原始数据做了一个共享映射(shared mapping)。不用copy数据的话,也就不用分配对应的内存空间,能极大提高效率。同时也不再怕这些数据从内存被换出(swapping)到外存去。


大家对这组patch set进行了非常细致的讨论。Andy Lutomirski不认为它能真正解决问题,相反“既危险又复杂”。他的一些担心后来讨论中被解决了,不过他还是觉得这些问题应该可以用splice()来解决。Kirill Shutemov担心用splice()的话可能跟内核的reverse-maping(反向映射)代码配合不好,会引入一些很难debug的问题。目前讨论还在进行;process_vm_mmap()可能最终还是有机会能合入kernel的,不过肯定需要先经过更多讨论。


Remote madvise()

有时候,一个进程会要通过madvise()调用,来让kernel改变对其他进程的内存处理。在Oleksandr Natalenko描述的一个例子里面,希望能让某个进程来加入kernel same-page merging (KSM,内核让相同内容的page避免创建多份copy)从而优化内存空间的使用。KSM是一个优化共呢过,需要用madvise()来申请加入的。如果这个目标进程没有自己调用madvise(),那外界就没有什么好方法能让它加入KSM。

Natalenko的方案是在/proc目录下每个进程的子目录里增加一个新的文件节点( 名字就是madvise)。这样只要对这个文件节点写入“merge”,就相当于这个进程主动调用madvise(MADV_MERGEABLE),保证本简称的全部地址空间都加入KSM;相应的,写入“unmerge”就可以关闭此进程的KSM。将来,可能可以继续优化,能允许此进程地址空间的一部分(而不是全部)来加入KSM,或者支持其他的madvise()功能。


对这组patch set的反应也不是非常乐观。Alexey Dobriyan觉得还不如增加一个新的system call来实现这个功能。Michal Hocko表示赞同,认为本次2019 LSFMM Summit上介绍的"remote madvise()",是一个更加合理的解决方案。


process_madvise()

与此同时,Minchan Kim按照remote madvise()的想法实现了一组patch set,具体来说实现了如下system call:


    int process_madvise(int pidfd, void *addr, size_t length, int advice);

这个函数的效果就好像这个pidfd(pidfd file descriptor,不是通常说的process ID)对应的进程调用了madvise()一样。此API本身很容易理解,不过不久之后这组改动的下一个patch就提供了一个很复杂的API:


    struct pr_madvise_param {
    int size;
    const struct iovec *vec;
   }

   int process_madvise(int pidfd, ssize_t nr_elem,
    int *behavior,
    struct pr_madvise_param *results,
    struct pr_madvise_param *ranges,
    unsigned long flags);

这个改动的本来目的是希望能让一次process_madvise()调用就能更改目标进程的地址空间里的多处区域。具体来说,behavior, results, 和ranges数组这几个参数,每个都是nr_elem多项。具体到每一个参数,behavior就是要调用的madvise() flag;ranges就是一组vec数组指定的内存空间,每个range处理过后的返回结果,都放在results数组里面。


这组patch set还增加了一些其他的madvise()操作,MADV_COOL可以让指定的那些page都被移到inactive list的头部,也就是在系统内存紧张的时候,让这些page能在不久之后就被回收(reclaim),肯定比active list里面的page更加早的被回收。

MADV_COLD,相应的会把这些page移动到inactive list的尾部,这样可能会让他们能立刻就被回收。这两个API都是Android运行时能够利用的功能。


社区对这组patch set的回应更加正面一点。绝大多数的意见都是关于一些命名上的小问题,似乎预示着它没有什么基本性的问题。Christian Brauner,此前完成了大多数pidfd的工作,他希望所以使用pidfd的system call都能够以"pidfd_"来开头,也就是希望API被命名为pidfd_madvise()。不过这里并不是所有人都赞同这个观点,所以最终用哪个名字还没有决定。还有一些人反对MADV_COOL和MADV_COLD这两个名字,不过同样也没有达成一致该用什么名字比较好。


Hocko比较疑惑为何需要这个多区域操作的API,毕竟调用madvise()的时候通常不需要很快的能完成。Kim回答说他今后会提供一些benchmark数据来证明这个API的必要性。


本文提到的这3个system call,process_madvise()是最有希望能推进的。看起来有明显的需求,需要让一个进程能修改其他进程的memory的处理策略。接下来就是慢慢夯实API的细节,定义清楚它应该如何工作了。


全文完

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

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议上的修改再创作~


长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~


640?wx_fmt=jpeg

madvise、fadvise、posix_madvise和posix_fadvise函数的使用   系统调用madvise的作用:建议内核如何使用指定段的内存,可配合mmap使用。函数原型如下: #include int madvise(void *addr, size_t length, int advice); 立即下载

相关推荐

手把手教你用内核远程call实现64位进程注入(附完整ShellCode示例)

本文深入探讨了在Windows 64位环境下,通过内核态直接操作线程TrapFrame结构实现进程注入的高级技术。文章提供了从驱动框架设计、用户态-内核态通信,到定位修改TrapFrame、编写Shellcode及执行环境恢复的完整实战指南,并附有详细的代码示例,为安全研究人员和开发者提供了绕过用户态检测、实现底层远程代码执行的新思路。

weixin_28396629的博客 344

madvise()详解

madvise() 函数建议内核,在从 addr 指定的地址开始,长度等于 len 参数值的范围内,该区域的用户虚拟内存应遵循特定的使用模式。内核使用这些信息优化与指定范围关联的资源的处理和维护过程。如果使用 madvise() 函数的程序明确了解其内存访问模式,则使用此函数可以提高系统性能。 #include #include int madvise(caddr_t addr, siz

wenjieky的专栏 3万+

测绘无人船避坑指南:云卓H12Pro遥控器接海康摄像头,从网络设置到RTSP流延迟优化全流程

本文详细解析了测绘无人船视频子系统的优化方案,重点介绍海康威视摄像头与云卓H12Pro遥控器的深度适配流程。从网络设置到RTSP流延迟优化,提供了一套经过实测的低延迟(<200ms)解决方案,适用于复杂水域环境下的测绘任务。

weixin_30415113的博客 625

Linux基础 -- 内存调优之 madvise 系统调用介绍

linux 内存调优 madvise

sz66cm 学习随笔 5724

Java调用YOLOv26全解析:从ONNX模型部署到工业质检实战

本文分享了工业自动化领域使用Java调用YOLOv26进行零件缺陷检测的完整方案。通过YOLOv26s模型结合ONNX Runtime Java部署,误检率和漏检率显著降低(分别从12%降至2.1%,8%降至0.8%)。文章详细介绍了方案选型理由、环境配置避坑指南、ONNX模型导出步骤,以及Maven依赖配置(分CPU/GPU版本)。该方案直接在上位机Java环境中运行,避免了跨语言调用损耗,适合工业质检场景部署,提供了可复用的性能优化和多线程推理实现。

2601_94871597的博客 1107

【XAI】透视深度学习:CNN与Transformer的可解释性方法

深度学习模型的可解释性方法解析:本文探讨了CNN和Transformer两类主流模型的可解释性技术。针对CNN,介绍了显著性图、类激活图(CAM/Grad-CAM)和基于扰动的方法,通过可视化重要像素区域揭示决策依据。对于Transformer,重点分析了注意力机制可视化及其在文本处理中的应用,并介绍了积分梯度等归因方法。文章包含详细的Python实现示例(使用Captum库),涵盖从MNIST图像显著性分析到BERT文本注意力可视化,为初学者提供了可操作的技术指南。这些方法有助于增强模型透明度,提升AI系

u012133341的博客 381

LWN:PID的复仇!以及process_madvise(), pidfd capabilities

关注了就能看到更多这么棒的文章哦~process_madvise(), pidfd capabilities, and the revenge of the PIDsByJonath...

Linux News搬运工 2116

用 ADT 连接 SAP S/4HANA Public Cloud 开发租户的完整落地指南

摘要:在SAP S/4HANA公有云中进行ABAP开发时,必须使用Development Tenant(客户端080)而非Customizing Tenant(客户端100)连接ADT工具。开发用户需具备SAP_BR_DEVELOPER角色且写权限不受限,开发对象应创建在结构包的子包中。连接前需确认正确的ABAP服务URL(通常为Launchpad URL去掉"/ui"),并通过运行控制台程序验证全链路功能。典型开发场景如通过BAdI实现业务校验时,需遵循Clean Core原则在指定包

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 336

LWN:在进程级别完成内核相同页面合并(KSM)控制!

关注了就能看到更多这么棒的文章哦~Process-level kernel samepage merging controlBy Jonathan CorbetApril 13, 2023DeepL assisted translationhttps://lwn.net/Articles/928510/内核相同页面合并(KSM, kernel samepage merging)功能可以在某些种类的...

Linux News搬运工 1381

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 109

GEE APP:时间序列影像批处理工具:按月筛选与智能导出解决方案出工具

本文介绍了一个基于Google Earth Engine(GEE)开发的智能时序影像处理工具,可高效处理遥感影像时间序列数据。该工具采用三栏式交互布局,包含控制面板、地图显示和缩略图预览区域。核心功能包括:1)灵活的时间筛选机制,支持年度范围选择和月份批量选择;2)智能影像筛选算法,基于云量、空间覆盖等条件自动选择最佳影像;3)交互式缩略图预览,支持点击加载完整影像;4)自动化批量导出系统,实现标准化命名和统一存储。工具可广泛应用于农业监测、城市扩张研究、生态环境评估等领域,显著提高遥感数据预处理效率,确保

此星光明博客 112

LWN:更好地控制透明巨页的使用!

PR_SET_THP_DISABLE 的实现是强制性的;相反,Hildenbrand 的补丁为 PR_SET_THP_DISABLE 添加了一个新选项,名为 PR_THP_DISABLE_EXCEPT_ADVISED,它提供了新的语义。正如 David Hildenbrand 的这个补丁(Usama Arif 已将其作为 这个系列 的一部分)所描述的,人们可以考虑让 madvise() 覆盖 PR_SET_THP_DISABLE,但正如 Hildenbrand 所说,“这会大大改变现有文档中描述的语义”。

Linux News搬运工 1812

运行后选择GDB/LLDB出现这样的窗口:launch: program ‘输入程序名称,例如 D:\Desktop\新建文件夹\a.exe‘ does not exist...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1127

LWN:5.14合并窗口结束了!

关注了就能看到更多这么棒的文章哦~The conclusion of the 5.14 merge windowBy Jonathan CorbetJuly 12, 2021DeepL a...

Linux News搬运工 506

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

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

LWN:mseal() 即将确定!

关注了就能看到更多这么棒的文章哦~mseal() gets closerBy Jonathan CorbetJanuary 19, 2024Gemini translationhttps://lwn.net/Articles/958438/2023 年 10 月首次提出的 mseal() 系统调用引发了一些争议。自那以后,它一直静悄悄地开发演进,并且似乎已经达到了相关评论者愿意接受的程度。预计会在...

Linux News搬运工 517

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

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

LWN:在GNU C库实现内存封印!

关注了就能看到更多这么棒的文章哦~Memory sealing for the GNU C LibraryBy Jonathan CorbetJune 12, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/978010/mseal()系统调用允许进程阻止其地址空间未来进行任何更改(因此被称为“密封 sealing”);它借鉴了...

Linux News搬运工 1736

LWN:让user space触发巨页融合!

关注了就能看到更多这么棒的文章哦~Triggering huge-page collapse from user spaceBy Jonathan CorbetMarch 14, 2022DeepL assisted translationhttps://lwn.net/Articles/887753/当内核首次开始支持巨页(huge page)的时候,这个方案把大部分的...

Linux News搬运工 337

LWN:配置透明巨页的一个新方法!

他提议的接口将是一个“结构体配置函数(struct-configured function)”,它接受一个描述所用应用程序编程接口(API)版本的新结构体,以及几种可能的操作之一。一个可选的 pidfd 可以将操作应用于一个单独的进程,并且一组布尔标志将配置该调用如何响应错误或请求范围中的空洞。尽管这些补丁集尚未公布,但邮件列表上的讨论清楚表明,设置进程特定 THP 策略的用例是存在的。Arif 认为Stoakes 的提议没有必要,并且会“引入大量代码来解决可以用非常非常简单的方式完成的事情”。

Linux News搬运工 2051

LWN: 利用 DAMON 进行内存主动回收!

关注了就能看到更多这么棒的文章哦~Using DAMON for proactive reclaimBy Jonathan CorbetJuly 23, 2021DeepL assiste...

Linux News搬运工 1412

LWN:5.10合并窗口的后半部分!

关注了就能看到更多这么棒的文章哦~The rest of the 5.10 merge windowBy Jonathan CorbetOctober 26, 2020https://l...

Linux News搬运工 461

LWN:用 BPF 控制内存管理

他希望探讨 BPF 可能发挥作用的方式,以及到目前为止阻碍基于 BPF 的解决方案进入主线的障碍。紧接着,Shakeel Butt 讨论了他希望看到的内核 内存控制器(memory controller)的演进方向,以及 BPF 如何融入其中。当内存充裕时,任何给定的组都可以使用多达其硬限制的内存,但当内存紧张时,其用量会被压缩回软限制。Hildenbrand 最后总结道,他看到了使用 BPF 的价值,但担心添加接口可能会迫使子系统在未来去维护那些令其后悔的特性。,以告知 BPF 程序内存用量的增加;

Linux News搬运工 103

LWN: 评评理应该牺牲谁的performance

点击上方蓝色字关注我们~Dueling memory-management performance regressionsByJonathan CorbetJune 1...

Linux News搬运工 224

LWN:内核5.4版本合并窗口——第二部分

点击上方蓝色“Linux News搬运工”关注我们~5.4 Merge window, part 2ByJonathan Corbet译者按:本文有两个笑话,看得懂的才...

Linux News搬运工 422

LWN: 如何更好地支持在内存中存放秘密信息?

点击上方蓝色“Linux News搬运工”关注我们~Keeping memory contents secretByJonathan CorbetNovember 15, 2019原文...

Linux News搬运工 256

LWN:关于readahead的讨论!

关注了就能看到更多这么棒的文章哦~A discussion on readaheadBy Jake EdgeJune 15, 2022LSFMMDeepL assisted translationhttps://lwn.net/Articles/897786/Readahead 是一种 I/O 优化,让系统读取的数据要比应用程序所要求的更多,因为相信这些额外的数据很快会被...

Linux News搬运工 478

LWN:用户空间的 per-CPU memory!

本质上,这是缓存行对齐数组方法的变体,但分配器会将分配的数据紧凑地排列在每个 CPU 的区域内,从而减少这些区域之间的内存浪费。Desnoyers 首先表示,他的目标是帮助用户空间开发者更好地利用 restartable sequences (可重启序列),它通过在关键部分中断进程(如果进程在此时被迁移),从而促进对 per-CPU 数据的某些类型的访问。因此,该库首先在一个特殊的“初始化区域”中初始化一个 CPU 的内存,然后为每个 CPU 创建该区域的写时复制(copy-on-write)映射。

Linux News搬运工 1516
上一篇: LWN: 想用python命令来调试kernel吗?drgn就是了!
下一篇: LWN: Linux稳定分支状况以及相应测试
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值