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

基于航天宏图PIE-SAR软件的高分三号(GF-3)SAR影像的预处理 软件官网 航天宏图—国内领先的卫星运营与应用服务提供商(官网) 一、数据导入 数据导入-GF-3-根据模式选择 参数文件导入解压后GF-3数据的XML文件 通道自动填充 设置输出目录 确定 等待,加载图像、自动构建金字塔 二、复数数据转换 强度/幅度特征是SAR影像最主要的特征之一,基于SAR强度/幅度影像可以提取地物目标信息,因此需要将SAR复数数据转换为SAR强度/幅度数据。导入输入影像,设置参数类型,输出目录、命名、类型; 漫长的等待 三、多视 为提... 阅读详情

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

process_madvise(), pidfd capabilities, and the revenge of the PIDs

By Jonathan Corbet
January 21, 2020

原文来自:https://lwn.net/Articles/810076/

从前,在某个进程被创建之后,其他进程就很难有办法对它进行操作了,只有给它发signal或者用ptrace()。现在,人们越来越有需求要能控制其他进程了,相应地,kernel的进程管理API也得到了扩展。process_madvise()系统调用就是其中一种,用来控制另一个进程内部内存管理方式的。这个最近提出来的一个process_ madvise(),尽管它有其合理性,但是也引起了许多人的提问,都是有关今后进程管理方式该如何改进的。

现有的madvise()系统调用是供某个进程来告诉kernel,关于他自己的地址空间该如何管理的。5.4的内核的madvise()调用中就多了一些新的建议类型:MADV_COLD和MADV_PAGEOUT。前者要求kernel把这块区域的内存页放到inactive list上去,也就是说它们已经挺长时间没有被访问过了。这些页面在后续内核进行内存回收的时候就会优先回收。MADV_PAGEOUT则语气更强烈一些,直接就说这些页面不会再用了,因此会导致马上被回收。

对于那些非常了解自己未来的访问模式的进程来说,这两个新类型会很有用处。不过在某些场景下——例如Android——进程其实并不清楚这个信息。在某些内存不再需要使用的情况,只有系统中的管理进程知道。比如说,在某个前台进程被放到后台的时候,这个进程的许多地址空间就可以标记成MADV_COLD了。这种环境中,要想最大限度地利用系统的内存资源,就需要让某个进程来替其他进程调用madvise()。这就是为什么要有process_madvise()的原因了。

Minchan Kim在1月初的时候就提过一组process_madvise() patch,当时的API是这样的:

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

效果上就像是pidfd所代表的这个进程自己调用了madvise()一样,参数也是addr, length, 和advice。这里的flags参数其实没有用,并且只支持madvise()的MADV_系列参数的一个子集(MADV_COLD,MADV_PAGEOUT,MADV_MERGEABLE,MADV_UNMERGEABLE)。其他的参数计划等到确有需要的时候再加。

从目前为止关于process_madvise()的讨论来看,基本没有什么阻碍,很快能进入mainline了。不过接下来,就有一些问题跳了出来。

Pidfd capabilities

其中一个问题跟process_madvise()并不直接相关,而是跟pidfd API通常用法有关。目前的patch set里面,是否能允许一个进程调用process_madvise()来操作另一个进程,是通过问一个问题来确定的:“是否允许用ptrace()?”。所以,这就意味着要么是同一个user ID的两个进程,要么就是拥有CAP_SYS_PTRACE的权限。这个判断问题本身并没有什么争议,不过Christian Brauner(pidfd patch的主要作者)提出了另一个想法:

When you create a pidfd, e.g. with clone3() and you'd wanted to use it for madvise you'd need to set a flag like pidfd_cap_madvise or pidfd_feature_madvise when you create the pidfd. Only if the pidfd was created with that flag set could you use it with madvise.

简单来说,pidfd自己包含了一个capability mask,来指定可以对它进行什么操作。这就像是通常的文件描述符一样:人们打开文件的时候如果允许了写操作,那么就可以对这个文件描述符进行写操作。Brauner希望在5.7的时候再合入process_madvise(),这样它就能直接开始使用这个capabilty机制了(目前还没实现好)。

关于pidfd的capability工作机制,Daniel Colascione问了个有趣的问题:是不是pidfd带有相应的capability flag就可以进行这个操作了,还是此前的传统判断方式也可以继续用?也就是说,加入如果一个进程拿到了另一个进程的pidfd,并且pidfd已经允许它传递给process_madvise()了,那么这个进程是否还需要试着进行ptrace()来判断是否可以操作?

Brauner在这个问题上有过反复。他说他倾向仍然需要检查权限,不完全依赖pidfd的capability flag。这样这些capability flag就变成了一个关闭开关,用来限制哪些操作是被禁止的。Colascione更希望直接用pidfd的capability flag来判断权限就够了。Brauner答应会仔细考虑这个方案,近期会发出patch。

PIDs: not dead yet

这个process_madvise() API的另一个特点是它必须要使用pidfd,这一点跟其他使用process ID的kill()或setpriority()等系统调用不同。pidfd是这个领域的新宠,通常来说大家都倾向于用pidfd。pid在哥哥namespace里面可能会不同,并且在目标进程退出之后,有一定的概率被用在另一个完全不相关的进程上;而pidfd则可以确定指向某个进程,不会变动。因此,pidfd很快变成了所有新增的系统调用中最受欢迎的确认进程的方式。Colascione的说法是:“All new APIs should use pidfds: they're better than numeric PIDs in every way”。

不过,看来并不是所有人都赞同这个观点。很多场景下pid本来就是已知的,而pidfd还需要专门去创建出来。用户还可以在命令行上指定某个pid,而pidfd则没法这么用。Kirill Tkhai就是其中一个反对者:

Ordinary pid interfaces also should be available. There are a lot of cases, when they are more comfortable. Say, a calling of process_madvise() from tracer, when a tracee is stopped. In this moment the tracer knows everything about tracee state, and pidfd brackets pidfd_open() and close() around actual action look just stupid, and this is cpu time wasting.

因此他认为每个新增的进城相关API都应该要既能处理PID,又能处理pidfd。Kim很认真地吸取了这个提议,在一周后的第二版process_madvise() patch set中就实现好了。这样新增的API就变为了:

    int process_madvise(int which, pid_t pid, void *addr, size_t length,
    			int advice, unsigned long flag);

这里新加的which参数要么是P_PID,要么是P_PIDFD,用来告诉kernel该如何理解pid参数。

这一改动提醒所有人都要注意一个问题。如果大家达成一致,都认为新增的进程相关API都应该同时支持这两种进程表达方式,那么就应该把这个规则推广开来,对新增的API一视同仁。否则process_madvise()也就不应该被强制要求这么做。如果今后某些API只支持一种方式,另一些API则两种都支持,那么就会是最坏的情况了。Linux的系统调用API目前已经有这样那样的一致性问题了,如果我们继续新增一些API让这个情况变得更差,未来的开发者会怎么看待我们?

全文完

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

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

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

【成功安装】Ubuntu22.04极简方式安装Nvidia驱动 今天下午安装了实机的Ubuntu,面临在Linux上安装Nvidia的问题,被这个问题困扰了一整个下午,各种报错整的我头大。后来发现了不需要按照传统的方式去Nvidia官网下载,再命令行安装,直接在线安装即可。 阅读详情

相关推荐

ZYNQ-7035+HMCAD1511高速数据采集系统设计

高速数据采集是电子测量、雷达信号处理与通信基带验证的核心技术基础,其性能瓶颈常集中于采样率、通道同步性与实时处理能力。基于ADC采样原理与SoC异构架构,高带宽、低抖动时钟链路与FPGA+ARM协同处理成为突破关键。ZYNQ-7035凭借275K逻辑单元与千级DSP资源,显著提升LVDS数据流吞吐与片上滤波/触发等实时算法部署能力;HMCAD1511则以1GSPS四通道同步采样和8位分辨率,满足示波器级动态范围需求。该组合广泛应用于嵌入式信号采集平台开发、教学实验系统构建及国产化仪器原型验证。

weixin_28939623的博客 261

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

点击上方蓝色字关注我们~New system calls for memory managementByJonathan CorbetMay 24, 2019社区提出一...

Linux News搬运工 916

论文阅读 Quantum Convolutional neural network

在传统的局域序参量(如磁化强度 ⟨Xi⟩)无法有效区分某些拓扑相(如 Haldane 相)时,字符串序参量(SOP)提供了一种方法来识别这些相。字符串序参量的定义通常涉及多个远离的站点之间的长程关联,通常具有如下形式:Zi,Xk,Zj是泡利矩阵(Pauli operators)。指数项 eiπ∑k=ijXk表示一个相位因子。这意味着我们要计算两个远离站点 i,j 的Z 分量的关联,同时考虑它们之间的X 作用。这个非局域的字符串序参量可以用来检测对称保护拓扑(SPT)相。

m0_54373077的博客 2000

添加一个系统调用

系统调用是内核向应用层提供的接口,今天我们就添加一个系统调用。

lyndon 859

【零基础入门哈希签名架构,从Lamport到SPHINCS+】第二集 哈希签名树 Merkle Tree Authentication

在第一集中,我们一直忽略了一个问题。设想一下,假如有一个Hacker(黑客),在截获到Sender发送给Receiver的公钥之后,把这个公钥改成Hacker自己的公钥,然后再发给Receiver,那么Receiver就会误认为这是Sender的公钥。所以我们之前所说放方案,其安全性都需要建立在一个前提下:Receiver需要确认公钥确实是Sender发出的。

m0_50572808的博客 2452

STM32f103--ADC配置

2.对于规则通道,选中EXTI线路11或TIM8_TRGO作为外部触发事件,可以分别通过设置ADC1和ADC2的ADC1_ETRGREG_REMAP位和ADC2_ETRGREG_REMAP位实现。注意: 在双ADC模式里,当转换配置成由外部事件触发时,用户必须将其设置成仅触发主ADC,从ADC设置成软件触发,这样可以防止意外的触发从转换。2.在某些双ADC模式中,在完整的ADC1数据寄存器(ADC1_DR)中包含了ADC1和ADC2的规则转换数据。通过设置ADC_CR2寄存器的ADON位可给ADC上电。

weixin_51864506的博客 5313

LWN:pidfd 新机制来获取进程信息和自我引用!

关注了就能看到更多这么棒的文章哦~Two pidfd tweaks: PIDFD_GET_INFO and PIDFD_SELFBy Jonathan CorbetOctober 16, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/992991/pidfd 机制使用文件描述符(file descriptor)来以一种明确且无竞态...

Linux News搬运工 2024

在Kintex-7 FPGA上实现皮秒级时间测量:手把手教你搭建CARRY4进位链TDC(附源码与约束)

本文详细介绍了在Kintex-7 FPGA上利用CARRY4进位链实现皮秒级时间测量(TDC)的完整方案。从CARRY4的物理特性分析到硬件架构设计,再到校准方法与精度提升技巧,手把手教你构建测量精度达53ps的TDC系统,并附源码与约束文件,助力激光雷达、高能物理等精密计时应用开发。

weixin_42550052的博客 444

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

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

Linux News搬运工 461

【QT开发教程】使用Qt进行NFC编程

近场通信(NFC,Near Field Communication)技术广泛应用于现代设备中,例如智能手机、支付终端和门禁系统。Qt提供了一套完整的NFC模块,使开发者可以轻松地在应用程序中实现NFC功能。本文将介绍如何在Qt中进行NFC编程,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 1468

python语言字符串练习题

描述:find()方法检测字符串中是否包含子字符串str,如果指定 beg(开始)和end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串,返回字符串中,子字符串第一个字符的索引值,否则返回-1。描述:find()方法用来检测字符串中是否包含子字符串str,在指定范围内,如果包含子字符串,返回字符串中,子字符串第一个字符的位置,否则返回-1。命令行先后输入两个字符串,然后利用find()方法找出第二个字符串在第一个字符串中出现的位置。本关需要你编写一个程序,输出字符串的长度。

国家一级致癌物 2025

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

linux 内存调优 madvise

sz66cm 学习随笔 5727

YOLOv8 改进有效涨点专栏目录 | 含卷积、主干、注意力机制、Neck、检测头、损失函数、二次创新C2PSA/C3k2等各种网络结构改进

YOLOv8在目标检测领域的地位与优势模型改进的意义与价值本专栏的特色与创新点读者学习路径建议关键改进点回顾不同场景的模型选型建议开源社区资源汇总持续学习路径指南YOLOv8在目标检测领域的地位与优势模型改进的意义与价值本专栏的特色与创新点读者学习路径建议关键改进点回顾不同场景的模型选型建议开源社区资源汇总持续学习路径指南。

weixin_39818775的博客 1072

《性能之巅第2版》阅读笔记(一)--操作系统基础

System performance: Enterprise and the Cloud, 2nd Edition

大吉 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VC中sqlite的使用

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

madvise()函数的解析

是一个用于向操作系统提供内存使用建议的系统调用(主要在 Linux 和类 Unix 系统中),目的是优化内存管理策略,从而提升程序性能。它允许应用程序告知内核某块内存区域的预期访问模式,内核会根据这些建议调整预读、缓存、分页等行为。)是 Linux 特有,其他系统(如 BSD)可能支持不同选项。,可以在处理大内存、文件映射或实时性要求高的场景中显著优化性能。内核可能忽略建议,具体行为取决于实现。通常需要按页对齐,否则可能失败(

qq_55655082的博客 1071

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android官方开发文档Training系列课程中文版:APP的内存管理

写在开头的话: 如果有同学对Android性能比较关注的,可以阅读这篇文章:Android性能优化建议 原文地址:http://android.xsoftlab.net/training/articles/memory.html 随机存储器(RAM)在任何运行环境中都是一块非常重要的区域,尤其是在内存受限的移动操作系统上。尽...

weixin_33836874的博客 211

android内存管理

http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://developer.android.com/training/articles/memory.html 随机存取存储器(RAM)再任何软件开发环境中都是宝贵的资源,但是在移动操作系统中,内存资源更为宝

GGGL的专栏 1075

[转载] Linux的capability深入分析

[转载] Linux的capability深入分析 一)概述: 1)从2.1版开始,Linux内核有了能力(capability)的概念,即它打破了UNIX/LINUX操作系统中超级用户/普通用户的概念,由普通用户也可以做只有超级用户可以完成的工作. 2)capability可以作用在进程上(受限),也可以作用在程序文件上,它与sudo不同,sudo只针对用户/程序/文件的概

a172742451的专栏 3028

madvise()详解

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

wenjieky的专栏 3万+

madvise和fadvise的区别

madvise() and posix_fadvise() are not synonymous. madvise() tells the kernel (give advise) what to do with existing memory region while fadvise() tells the kernel what to do with cached (or future cac

珺珺去哪儿 4510

mmap & madvise 你知道它们吗?

我今天看到好多之前没有见过的系统调用和函数。。。。。晕了。。。。。。 madvise函数 这个东西,应该是系统调用,因为他在man手册的2区。 madvise 可以设置内存的分配方式。或者说成是分配的细节方式。 The advice is indicated in the advice argument which can be MADV_NORMAL

嵌入式 3604

使用 madvise()

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

hustmp的专栏 2302

os模块篇(十八)

os.posix_spawnp() 是 Python 的另一个用于创建新进程的函数,它与 os.posix_spawn() 类似,但有一个关键的区别:os.posix_spawnp() 会使用 PATH 环境变量来查找要执行的程序。在这个例子中,我们首先使用 os.getpriority() 函数获取当前进程的 nice 值,然后调用 os.nice(5) 来增加 nice 值,最后再次调用 os.getpriority() 来确认 nice 值已经改变。这个函数的主要用途是在父进程中跟踪子进程的状态。

记录学习过程 934

linux进程阻塞的原因,释放大块内存时的阻塞问题

一、前言在堆上申请和释放内存的性能不高,这应该是常识了,尤其释放大块内存时,耗时更长,甚至会阻塞其他线程。做性能优化时,一般会采用内存池等手段避免频繁的申请和释放内存。本文从内核的角度分析申请和释放内存时的阻塞瓶颈,及化解方法。为了便于理解,本文从用户申请、访问、释放内存的角度出发,逐步深入探讨Linux的内存管理。本文以阻塞为线索,从堆内存和栈内存的区别,到malloc的原理,再到内存页的管理,...

weixin_28678151的博客 2146

LWN:用DAMON来优化memory-management!

关注了就能看到更多这么棒的文章哦~Memory-management optimization with DAMONByJonathan CorbetFebruary 20, 2020...

Linux News搬运工 1028

linux系统调用号查询(pwn)

在线查询链接:https://syscalls.w3challs.com/ 分为32位和64位,链接中还有arm、mips等架构的系统调用号。 32位 cat /usr/include/asm/unistd_32.h #ifndef _ASM_X86_UNISTD_32_H #define _ASM_X86_UNISTD_32_H 1 #define __NR_restart_syscall 0 #define __NR_exit 1 #define __NR_fork 2 #define __NR_r

SkYe's Blog 1124
上一篇: LWN:Dentry negativity
下一篇: LWN:使用Jitsi进行视频会议!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值