我可以要求内核填充(故障)一系列匿名页面吗?

2024-01-25

在Linux中,使用C,如果我通过以下方式请求大量内存malloc或类似的动态分配机制,很可能支持返回区域的大多数页面实际上不会映射到我的进程的地址空间。

相反,每次我第一次访问其中一个分配的页面时都会发生页面错误,然后内核将映射到“匿名”页面(完全由零组成)并返回到用户空间。

对于较大区域(例如 1 GiB),这是大量页面错误(4 KiB 页面约为 26 万个),并且each故障会导致用户到内核用户的转换,这在具有 Spectre 和 Meltdown 缓解措施的内核上尤其缓慢。对于某些用途,此页面错误时间可能会主导缓冲区上正在完成的实际工作。

如果我知道我将使用整个缓冲区,是否有某种方法可以要求内核映射一个已绘制区域提前时间?

如果我使用分配自己的内存mmap,这样做的方法是MAP_POPULATE- 但这不适用于从以下地址收到的区域malloc or new.

有的是madvise调用,但那里的选项似乎主要适用于文件支持的区域。例如,madvise(..., MADV_WILLNEED)调用似乎很有希望 - 从手册页来看:

MADV_WILLNEED

预计在不久的将来能够访问。 (因此,提前阅读几页可能是个好主意。)

明显的含义是,如果该区域是文件支持的,则此调用可能会触发异步文件预读,或者可能在后续故障时触发同步附加预读。从描述来看,尚不清楚它是否会对匿名页面执行任何操作,并且根据我的测试,它不会。


这是一种肮脏的黑客行为,最适合特权进程或具有高权限的系统。RLIMIT_MEMLOCK,但是……一个mlock and munlock配对将达到您正在寻找的效果。

例如,给出以下测试程序:

# compile with (for e.g.,): cc -O1 -Wall    pagefaults.c   -o pagefaults

#include <stdlib.h>
#include <stdio.h>
#include <err.h>
#include <sys/mman.h>

#define DEFAULT_SIZE        (40 * 1024 * 1024)
#define PG_SIZE     4096

void failcheck(int ret, const char* what) {
    if (ret) {
        err(EXIT_FAILURE, "%s failed", what);
    } else {
        printf("%s OK\n", what);
    }
}

int main(int argc, char **argv) {
    size_t size = (argc == 2 ? atol(argv[1]) : DEFAULT_SIZE);
    char *mem = malloc(size);

    if (getenv("DO_MADVISE")) {
        failcheck(madvise(mem, size, MADV_WILLNEED), "madvise");
    }

    if (getenv("DO_MLOCK")) {
        failcheck(mlock(mem, size), "mlock");
        failcheck(munlock(mem, size), "munlock");
    }

    for (volatile char *p = mem; p < mem + size; p += PG_SIZE) {
        *p = 'z';
    }
    printf("size: %6.2f MiB, pages touched: %zu\npoitner value : %p\n",
            size / 1024. / 1024., size / PG_SIZE, mem);
}

以 root 身份运行 1 GB 区域并计算页面错误perf结果是:

$ perf stat ./pagefaults 1000000000
size: 953.67 MiB, pages touched: 244140
poitner value : 0x7f2fc2584010

 Performance counter stats for './pagefaults 1000000000':

        352.474676      task-clock (msec)         #    0.999 CPUs utilized          
                 2      context-switches          #    0.006 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
           244,189      page-faults               #    0.693 M/sec                  
       914,276,474      cycles                    #    2.594 GHz                    
       703,359,688      instructions              #    0.77  insn per cycle         
       117,710,381      branches                  #  333.954 M/sec                  
           447,022      branch-misses             #    0.38% of all branches        

       0.352814087 seconds time elapsed

但是,如果您运行前缀为DO_MLOCK=1, 你得到:

sudo DO_MLOCK=1 perf stat ./pagefaults 1000000000
mlock OK
munlock OK
size: 953.67 MiB, pages touched: 244140
poitner value : 0x7f8047f6b010

 Performance counter stats for './pagefaults 1000000000':

        240.236189      task-clock (msec)         #    0.999 CPUs utilized          
                 0      context-switches          #    0.000 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
                49      page-faults               #    0.204 K/sec                  
       623,152,764      cycles                    #    2.594 GHz                    
       959,640,219      instructions              #    1.54  insn per cycle         
       150,713,144      branches                  #  627.354 M/sec                  
           484,400      branch-misses             #    0.32% of all branches        

       0.240538327 seconds time elapsed

请注意,页面错误数量已从 244,189 减少到 49,并且速度提高了 1.46 倍。绝大多数时间仍然花费在内核中,因此如果不需要同时调用两者,这可能会快得多mlock and munlock也可能是因为语义mlock超过了需要的数量。

对于非特权进程,您可能会遇到RLIMIT_MEMLOCK如果您尝试一次执行一个大区域(在我的 Ubuntu 系统上,它设置为 64 Kib),但您可以循环调用该区域mlock(); munlock()在较小的区域上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以要求内核填充(故障)一系列匿名页面吗? 的相关文章

  • 更改 Visual Studio 2015 扩展中项目内的文件 ProjectItem 的内容?

    如何更改文件的内容 ProjectItem在给定的范围内Project 我想用字符串替换它的所有内容 这个问题有解决办法吗 我想做一些改变ProjectItem CS 文件 通过使用 VSIX 包 以及我现在看到的唯一一种执行此操作的方法
  • 如何在函数中将结构成员作为指针传递?

    问题是我有一个结构是另一个 主要 结构的成员 我编写了一个函数来清除第一个结构 它需要一个指向结构的指针 我想使用该函数来清除主要结构内的结构 但我不确切知道哪种方法是正确的 为了更好地解释它 这里有一些代码 我有一个结构 定义为 type
  • ASP .NET MVC 5 - 客户地址一对一关系

    我在这里查看了论坛 实际上发现了一些类似的问题 但不是相同的问题 类似的解决方案没有给我正确的答案 我正在使用实体框架和代码优先方法来处理 ASP NET MVC 5 我想建立客户 gt 地址一对一关系的模型 我建模的是 客户等级 publ
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 使用 std::string 导致 Windows“找不到入口点”[重复]

    这个问题在这里已经有答案了 当我用 G C C 编译它时 include
  • DLL 需要访问其应用程序的符号

    在 C 中 DLL 是否可以访问加载它的应用程序的某些符号 我有一个加载插件 dll 的应用程序 这些插件需要访问该应用程序的某些API 是否可以在不创建共享此 API 的新 DLL 的情况下实现此目的 函数指针结构适合这种情况吗 示例 主
  • MSBuild 将动态生成的文件复制为项目依赖项的一部分

    我有一个自定义 msbuild 任务 它正在生成一些输出文件到 ProjectA 的输出目录 TargetDir 当前的代码是这样的
  • 通过 Nuke.Common/NuGet.CommandLine 部署 NuGet 包时如何通过 Azure Auth

    我正在尝试通过 Azure DevOps 上的 Nuke 和 CI CD 自动执行 NuGet 包更新 一切都构建得很好 但在 PushNuGet 步骤中 该过程尝试通过弹出窗口向 Azure 进行身份验证 这显然从未在 in devops
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • XPath 选择具有特定属性值的元素?

    我在使用 XPath 选择节点时遇到问题 我将展示一个示例 由于实际数据量很大 xml 文件被缩短了 这是 XML 的子集
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • 当“多次安装 MSBuild”时,Dotnet 项目转换尝试转换失败

    try convert w Test csproj target framework netstandard2 0 结果是 Multiple installs of MSBuild detected please select one In
  • std::regex 转义正则表达式中使用的特殊字符

    我是字符串来创建一个std regex FILE 作为单元测试的一部分 检查一些打印文件名的异常输出 在 Windows 上失败并显示 regex error error escape 表达式包含无效的转义字符或尾随转义 因为 FILE 宏
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi
  • 从哪里开始阅读 SQLite 源代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想了解sqlite是如何实现的 并且 想阅读源代码 我已经下载了源代码 我应该开始查看代码的哪一部分 SQLite文档页 http
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理

随机推荐

  • 避免位图内存不足错误的建议

    我正在开发一个 Android 应用程序 该应用程序有一个包含大量图像的视图 我有一个错误 我会尽力提供尽可能多的信息 希望有人能给我一些建议 该应用程序在所有本地测试中都运行良好 然而 我收到了很多来自用户的崩溃消息 java lang
  • Swift 将 UITextView 文本保存为 .Pdf、.Doc 和 .Txt 文件格式并显示

    我的场景是 我尝试以三种格式保存 UITextView 文本 pdf doc 和 txt 在这里 格式化选项用户可以根据警报选项进行选择 保存后需要在预览控制器中显示以进行文件共享 如何实现这一目标 func createPDF text
  • IE >= 8 的原型 Event.StopPropagation

    我了解处理 IE 的 event stopPropagation 的正确方法是 if event stopPropagation event stopPropagation else event returnValue false 但是是否
  • 配置 ADP 应用程序以使用不同的数据库...?

    我有一个 Access 项目 ADP 当前配置为连接到一台服务器上的 SQL Server 2000 数据库 我现在需要将该服务器迁移到位于另一台服务器上的 SQL Server 2008 这只是修改连接字符串以将应用程序指向新数据库的简单
  • quotRem 和 divMod 之间的区别什么时候有用?

    来自哈斯克尔报告 quot rem div 和 mod 类 如果 y 是 方法满足这些定律 非零 x quot y y x rem y x x div y y x mod y x quot整数除法是否被截断 趋于零 而结果div被截断为负无
  • 如何在React JS中动态更新MaterialUI DataGrid表

    这是我正在尝试做的事情的概要 当用户单击一行中的复选框时 该行将被保存以免被删除 通常用户将单击多行 一旦用户点击 清除记录 按钮 所有没有选中复选框的记录都会被删除 我得到了一些关于如何做到这一点的一般建议 并且我使用了给我的建议以及我自
  • Android studio 错误“检测到不支持的模块:以下模块不支持编译”

    我使用的是Android Studio 1 0 1 我的项目中有一个被其他模块引用的 java 模块 我已经从 SVN 上查过了但是现在每个 检测到不支持的模块 以下模块不支持编译 遗憾的是 您不能在一个项目中同时拥有非 Gradle Ja
  • 如何将 Comodo SSL 应用于 Kubernetes Ingress?

    我们购买了 Komodo SSL 证书 它有 5 个文件 我正在寻找有关如何将其应用到 Kubernetes Ingress 的指南 正如它所描述的文档 https kubernetes io docs concepts services
  • 如何避免 ion-option/ion-select 中的确定/取消按钮

    您好 如何避免离子选项中的 确定 和 取消 按钮 I need an output as the below image after clicking the ion option 我已经尝试了所有选项http ionicframework
  • 如何检测现有文件引起的System.IO.IOException?

    我想创建并打开一个文件 但前提是该文件不存在 我不想使用 File Exists 因为在创建同名文件后会切换线程 如何检查 System IO IOException 异常是否是由现有文件引起的 我不想解析错误消息 即使它可以像 index
  • 为什么 Heroku 每天都会重置我的文件“data.json”?

    我制作了一个discordJs 机器人 它将数据保存在文件中 一切都托管在 Heroku 上并且一切正常 但每天 Heroku 都会重置我的文件 为什么我不能每天保存我的文件 以下是 Heroku 文档的完整解释 Heroku 文件系统是短
  • 真正停止元素绑定 - 取消元素绑定 - AngularJS

    我正在尝试找出如何阻止DOM来自角度范围内的绑定数据的元素 我知道您可以使用 if 语句等来做到这一点 但是有没有一种真正且永久的方法来停止绑定角度元素但保留添加的内容 所以说我有这个 div class Welcome div 我更改了模
  • CSS Firefox - 如何停用虚线边框(firefox 单击指示器)?

    对于我最近的网络项目来说 这个点击指示器是一个令人厌恶的部分 我讨厌这个 我如何对我的 Firefox 浏览器说他不应该标记单击的对象 如果您的菜单项不是输入元素 例如按钮 您可以使用 CSS 隐藏它 如下所示 element outlin
  • Unity3D Sprite ...但是单面的?

    团结优秀Sprites Unity优秀的新精灵 http docs unity3d com ScriptReference Sprite html 除其他有价值的优点外 实际上是双面的 在 2D 或 3D 用例中 您可以翻转这些小混蛋 但仍
  • Service Fabric 无状态服务器自定义 UDP 侦听器

    我们正在尝试定义一个 Service Fabric 无状态服务 用于侦听 UDP 数据 我们正在与 Microsoft 合作 他们表示支持 TCP 并且我应该设置 TCP 以下是 ServiceManifest xml 文件的片段
  • 左浮动 div 放置在另一个 div 下面 [重复]

    这个问题在这里已经有答案了 我有两个 div 而 div 1 向左浮动 而 div 2 向右浮动 我正在创建一个响应式布局当视口发生变化时 div 1 将移至 div 2 下方 我通过 MS Paint 创建了一个简单的图像 以便更容易地进
  • 如何在程序中最好地显示大量项目

    我目前拥有 952 件大型收藏品 我将其中大约 500 个以上显示为多边形 这在我的应用程序中造成了一些明显但可管理的延迟 我可以用来同时显示这些项目的最轻量级的控件 元素是什么 DrawingVisuals 提供了比 Paths 更轻量级
  • 使以编程方式创建的 jQuery UI 日期选择器与 CSS 范围一起工作

    这解决了 jQuery UI 的限制not自版本 1 10 3 起已修复 jQuery UI 有一个主题滚轮 http jqueryui com themeroller 函数允许您设置 jQuery UI 小部件的样式 但有时您需要在一页上
  • 使用 Google 地理编码器/API 根据地址返回邻居

    有没有什么方法可以根据传入的地址 邮政编码 城市 州向 Google 地理编码器有效 准确地提取城市内的社区 每当我尝试通过 HTTP 理想解决方案 执行此操作时 它都会返回以下信息
  • 我可以要求内核填充(故障)一系列匿名页面吗?

    在Linux中 使用C 如果我通过以下方式请求大量内存malloc或类似的动态分配机制 很可能支持返回区域的大多数页面实际上不会映射到我的进程的地址空间 相反 每次我第一次访问其中一个分配的页面时都会发生页面错误 然后内核将映射到 匿名 页