AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 789383
Accepted
Harimbola Santatra
Harimbola Santatra
Asked: 2025-01-11 21:33:07 +0800 CST2025-01-11 21:33:07 +0800 CST 2025-01-11 21:33:07 +0800 CST

Linux 有标准输出的缓存吗?

  • 772

我知道最近访问的文件会被缓存到 RAM 中,但是是否有用于频繁执行的命令的缓存?

例如,如果我运行cat file.txt多次,file.txt则会在第一个命令后缓存。

  1. 但是如果我运行ps aux多次,第一个命令的输出会被缓存在某处吗?
  2. 每个应用程序是否都有自己的常用命令缓存;例如git log?

阅读完这个相关问题后,我认为正确的术语是memoization。

filesystems
  • 3 3 个回答
  • 1378 Views

3 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2025-01-11T22:29:52+08:002025-01-11T22:29:52+08:00

    系统将缓存与命令可执行文件关联的文件以及命令运行时从磁盘读取的任何文件。后续命令执行可能会受益于该缓存,并且需要更少或不需要物理磁盘读取操作。这对用户和命令本身都是透明的。

    但是输出不会被缓存。每次执行命令都会生成新的输出,即使该输出与上次运行命令时的输出相同。

    在ps aux示例中,ps调查当前进程列表并根据给定的参数输出该列表。系统无法输出输出的缓存变体(因为没有这样的缓存)以避免运行ps。同样,git log将访问并输出当前存储库的日志。系统无法避免执行命令,也无法避免让其读取存储库的存储状态等。

    命令可能会受益于文件系统缓存、缓冲区等缓存的各种数据,但输出每次都会从头开始重新生成。

    实现命令输出的通用缓存将非常棘手,因为您通常不知道对系统的哪些更改会使缓存失效。有些命令要求文件更改后才能生成不同的输出,而其他命令会由于时间流逝、随机机会或其他事件的发生而生成不同的输出。除了输出到标准输出之外,命令还可能具有许多副作用,例如以各种方式更新文件数据,这使得缓存输出更加困难且通常毫无意义(因为将输出发送到标准输出流可能不是运行命令的主要原因)。

    单个命令可能会缓存其输出或使用检查点来避免重新进行昂贵的中间计算。不过,它们会在特定问题领域内执行此操作(各种编译器缓存、科学软件中确定性模拟的检查点等),而操作系统不会为它们透明地执行此操作。特别是,操作系统无法避免执行这些命令而只是输出结果。

    • 19
  2. user10489
    2025-01-11T22:34:05+08:002025-01-11T22:34:05+08:00

    操作系统缓存磁盘块和 inode,但实际上不缓存文件。磁盘块缓存会产生明显的文件缓存副作用。

    应用程序没有操作系统级缓存。一些执行高开销操作的应用程序可能有自己的缓存,这些缓存是应用程序通过将文件写入磁盘来实现的。

    例如,如果您查看主目录,可能会有一个名为的隐藏目录~/.cache/,其中包含应用程序缓存文件。同样,也可能存在全局缓存/var/cache/。

    但是,像 ps 这样的命令实际上并不需要缓存,因为它的输出非常动态,而且生成成本并不高,因此缓存的意义不大。相比之下,它atop依赖于进程记账来收集长期进程信息;它可以在 10 秒内收集这些信息,也可以从进程记账缓存中提取这些信息。

    • 7
  3. anuj tyagi
    2025-01-13T23:47:10+08:002025-01-13T23:47:10+08:00

    在 Linux 中,虽然操作系统采用缓存机制来提高性能(例如将文件内容缓存在 RAM 中以加快后续访问),但它不会缓存命令的标准输出 (stdout)。

    Linux 不会缓存命令的标准输出。每次执行命令都会根据当前系统状态生成新输出。虽然操作系统会缓存文件内容以优化访问,并且某些应用程序会实施自己的缓存策略,但命令的标准输出仍未缓存,以确保准确性和相关性。

    • 0

相关问题

  • 我应该在 NAS 的 SD 卡中使用哪个文件系统?

  • 如何提前知道 .zip 内部是否有父目录

  • Virtualbox 动态分配磁盘 *.vdi 不断增长

  • du/df 和 ls 报告不同的磁盘使用情况

  • Linux 内核开发人员如何处理数百万行代码的工作?他们是一种方法吗?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve