Linux 上的匿名内存是页面缓存的一部分吗?

2023-11-29

Is 匿名记忆- 即程序堆和堆栈 - Linux 上页面缓存的一部分?内核的链接文档没有说明这一点。

But the Wikipedia entry about Page Cache contains a graphic (look at the top right) which gives me the impression that malloc() allocates dynamic memory within the page cache:
linux storage stack diagram from thomas krenn

那有意义吗?关于mmap(),当它用于访问文件时,使用页面缓存是有意义的。通常也用于匿名内存,例如malloc()和匿名映射通过mmap()?

我希望得到一些解释。

谢谢。

编辑2021-03-14
我决定最好向内存子系统的内核维护者询问他们的情况邮件列表。幸运的是马修·威尔考克斯回应并帮助我。提炼:

  • 匿名内存不由page cache.
  • 匿名页面有多种不同的处理方式——可以在LRU lists(最近最少使用),可以通过page tables。有点临时的。
  • 维基百科的图表是错误的。它还包含更多缺陷。
  • 如果系统提供交换并且匿名内存被交换 - 它会进入swap cache,不是page cache.

讨论可以继续阅读here or here.


TLDR:不,除了具有特殊文件系统支持的匿名内存(如 IPC shmem)。


Update:更正答案以纳入新信息内核邮件列表讨论与OP。


页缓存最初旨在成为操作系统级内存区域,用于快速查找磁盘支持的文件,其原始形式是缓冲区缓存(旨在缓存磁盘中的块)。页缓存的概念是在 1995 年 Linux 诞生后出现的,但前提是相似的,只是一个新的抽象——页 [1]。 事实上,最终这两个缓存合二为一:页缓存包含了缓冲区缓存,或者更确切地说,缓冲区缓存就是页缓存[1, 2].

那么页面缓存中存放了什么?除了传统的磁盘支持的文件之外,为了使页面缓存尽可能通用,Linux 有一些页面类型的示例,它们不遵守磁盘支持的页面的传统概念,但仍然存储在页面缓存。当然,如上所述,缓冲区高速缓存(与页高速缓存相同)用于存储磁盘支持的数据块。块的大小不一定与页的大小相同。事实上,我了解到它们可以小于页面 [第 323 页3]。在这种情况下,被视为缓冲区高速缓存一部分的页面可能由与磁盘上不连续内存区域相对应的多个块组成。那么,我不清楚缓冲区高速缓存中的每个页面是否必须是页面和文件之间的一对一映射,或者一个页面是否可以由来自不同文件的块组成。尽管如此,这是一种页面缓存使用方式,不符合原始页面缓存的最严格定义。

接下来是交换缓存。正如 Barmar 在评论中提到的,匿名(非文件支持的页面)可以交换到磁盘。在磁盘和返回的过程中,页面被放入交换缓存中。交换缓存重新利用了与页面缓存类似的数据结构,特别是address_spacestruct,尽管设置了交换标志和一些其他差异[pg.1]。 731 的4, 5] 但是,由于交换缓存被视为与页面缓存分离,因此交换缓存中的匿名页面不被视为“在页面缓存中”。

最后:关于是否的问题mmap/malloc正在页面缓存中分配内存。正如[5], 通常,mmap使用来自空闲页面列表的内存,而不是页面缓存(我认为除非没有剩余的空闲页面)。使用时mmap为了映射文件以进行读写,这些页面最终会驻留在页面缓存中。然而,对于匿名记忆,mmap/mallocd 页通常不驻留在页缓存中。

一个例外是具有特殊文件系统支持的匿名内存。例如,共享内存mmapd 进程之间的 IPC 由基于 ram 的支持tmpfs [6]。该内存位于页面缓存中,但是匿名的,因为它没有磁盘备份文件 [pg.1]。 600 的4].

Sources:

  1. https://lwn.net/Articles/712467/
  2. https://www.thomas-krenn.com/en/wiki/Linux_Page_Cache_Basics
  3. https://doc.lagout.org/operating%20system%20/linux/Understanding%20Linux%20Kernel.pdf
  4. https://lore.kernel.org/linux-mm/[电子邮件受保护]/
  5. https://github.com/torvalds/linux/blob/master/Documentation/filesystems/tmpfs.rst
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 上的匿名内存是页面缓存的一部分吗? 的相关文章

  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 什么时候通过引用传递不是一个好主意?

    这是一个我从未真正理解的内存分配问题 void unleashMonkeyFish MonkeyFish monkey fish new MonkeyFish std string localname Wanda monkey fish g
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • Pyaudio 安装错误 - “命令‘gcc’失败,退出状态 1”

    我正在运行 Ubuntu 11 04 Python 2 7 1 并想安装 Pyaudio 于是我跑了 sudo easy install pyaudio 在终端中 进程退出并显示以下错误消息 Searching for pyaudio Re
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少

随机推荐

  • Flask 会话不会在 heroku 上持久存在

    当用户登录到我的示例应用程序时 我将用户名密钥添加到会话对象中 并将用户对象挂在全局 g 对象之外 见下文 app route login methods GET POST def login Logs the user in error
  • 逃避大括号的简单方法?

    有没有一种简单的方法可以用 Handlebars 构建字符串 value 也许类似于 Handlebars compile var var value 车把支持空白 特点 以下应该有效 Handlebars compile var var
  • 在 Grails 中,如何指定 ivy 解析器所需的 jar?

    在 grails 项目中 我根据参考文档添加了一个自定义 ivy 解析器 http www grails org doc latest guide single html 12 2 20 插件 20 存储库 然而 这个解析器需要 jsch
  • Swift 中的 HTTP 请求与 swift3 中的 POST 方法

    我正在尝试在 Swift3 中运行 HTTP 请求 将 2 个参数 POST 到 URL Example Link http test tranzporthub com street45 customer login php Params
  • JavaFX - BorderPane/StackPane 在子项更改后未调整大小

    从 JavaFX BorderPane 添加和删除内容时 我遇到调整大小问题 在手动调整窗口大小之前 不会调整 BorderPane 内容的大小 我编写了一个小型测试应用程序来模拟这种行为 该应用程序构建了一个 BorderPane 其中包
  • 无法将Redis服务器连接到nodejs,Docker compose

    我正在努力将 Redis 部署连接到我的 Nodejs 应用程序 当然 在本地不使用 docker 它工作得很好 所以我对这是否与我的代码有关 或者我设置 docker compose 文件的方式有争议 Dockerfile FROM no
  • 日期时间(微秒)

    微秒的日期时间值是否会以精确的精度转换为双精度 例如 我的日期是2017 年 7 月 3 日 10 00 00 00 刻度 636346728000000050 正如我所得到的那样 它转换为双倍42919 4166666667 同样 我已将
  • 如何获得 Spinner 的选定值?

    我正在尝试从 a 中获取选定的项目字符串Spinner 到目前为止我已经得到了这个 bundle putString ListDbAdapter DB PRI v getText toString 这不起作用并给出一个类转换异常 我想我可以
  • 在 xcode/ios 中以编程方式编辑 RTF/DOC 文件

    我有一个可以在 iPhone 上查看的 RTF 文件 现在我需要以编程方式编辑该文件 请告诉我该怎么做 例子 RTF文件内容 我是 StackOverflow 的新手 现在我需要以编程方式更改为以下行 我经常访问 StackOverflow
  • 在 Linux 中查找包的二进制文件

    我正在完成一个包 但是我似乎没有找到一种方法使包在系统中找到二进制文件 请注意下面的代码 find nim lt function message TRUE nimexe lt if Platform OS type unix nimexe
  • Laravel 中 Count 为零时如何获取记录

    我使用 Chart js 来显示每个月的预订数量 这是我的查询 它运行良好 我的问题是 如果一个月内没有预订 那么它不会显示任何内容 没有零值 在图表上我得到的值如下 1月23日 2月34日 4月23日 May 25 July 42 图表上
  • Pyspark 中的 JSON 文件解析

    我对 Pyspark 很陌生 我尝试使用以下代码解析 JSON 文件 from pyspark sql import SQLContext sqlContext SQLContext sc df sqlContext read json f
  • 网站图标在 IE 中不工作

    我有一个使用自定义 favicon ico 的网站 图标在除 IE 之外的所有浏览器中按预期显示 当尝试在 IE 中显示图标时 我得到大红色 x 当在另一个浏览器中显示图标时 它显示得很好 页面源码包括 它确实可以在其他浏览器中工作 谢谢你
  • jQuery + MarkItUp + Polymer - 让它发挥作用吗?

    Using Polymer 我正在尝试创建一个可重用的组件markItUp这样我就可以在需要时使用富文本编辑器 但是 尽我所能 我无法让它正确初始化 jQuery 选择器根本无法找到 textarea 元素来发挥其魔力 我已经尝试了很多添加
  • 子表中的外键约束允许插入父表中不存在的值

    我正在使用 SQL Server 2012 我已经在表上定义了外键约束 外键引用复合主键 当一列具有 00000 而另一列为空时 fk 约束不起作用 父表不包含 00000 两个 fk 列都有varchar数据类型 下面是示例 INSERT
  • 通知消息是否会计入collapse_key 限制?

    根据Firebase 通知文档 通知消息始终是可折叠的 我试图弄清楚他们是否有一些内在的collapse key 如果是这样 这是否算作collapse key每台设备最多 4 个 你是对的 从 Web 控制台发送的所有通知都是可折叠的 这
  • drupal_add_css、drupal_add_js 不起作用

    我在用drupal add css and drupal add js 将 CSS 和 JavaScript 文件添加到我的 Drupal 站点 我在一个名为 control 的模块中执行此操作 因此我正在使用的函数被称为control p
  • 如何从 HTML 中删除多个空白字符?

    我想删除来自用户端的额外空白 但我无法预测 HTML 的格式 例如 p It s interesting that you would try cfsetting since nothing in it s documentation wo
  • 解析 YAML,即使在有序映射中也能获取行号

    我需要获取 YAML 文件中某些键的行号 请注意 这个答案没有解决问题 我确实使用鲁梅尔 yaml 并且答案不适用于有序地图 usr bin env python3 coding utf 8 from ruamel import yaml
  • Linux 上的匿名内存是页面缓存的一部分吗?

    Is 匿名记忆 即程序堆和堆栈 Linux 上页面缓存的一部分 内核的链接文档没有说明这一点 But the Wikipedia entry about Page Cache contains a graphic look at the t