【问题标题】:Linux kernel - is there a readahead/prefetch mechanism for writes?Linux 内核 - 是否有用于写入的预读/预取机制?
【发布时间】:2021-09-30 03:28:26
【问题描述】:

我知道预读是 Linux 内核中的一种预取形式,但我认为预取更多的是关于硬件(缓存)预加载,而预读是一种操作系统级别的行为,用于从磁盘加载到内存/RAM 中。似乎在读取期间预读是only used,但对于写入则不是。我知道名称中有“读取”,但为什么不将预读/预取用于写入?

按照here 的建议,我想我有一个答案(在下面发布),但想要 cmets、建议或更好的答案。

【问题讨论】:

  • 缓存写入的主要好处是避免写入。如果您对同一个位置进行多次写入,则只需将最后一次写入磁盘即可。
  • 请不要在标题中添加与问题无关的文字
  • @mightyWOZ 抱歉,我试图坦率地说明意图
  • 不用抱歉,我们都是来帮助和寻求帮助的,但是措辞清晰的问题会使回答者的任务变得容易一些。
  • @wxz 读写是内核中不同的路径。读取是同步提交的,因为有一个任务在等待数据。写入在后台刷新到磁盘。第一个块的部分写入将触发读取,但如果您正在写入完整块,则不需要读取。写入端没有将(或应该)触发读取的预测代码。当读取端检测到顺序访问模式时,就会完成预读。

标签: linux memory-management linux-kernel operating-system prefetch


【解决方案1】:

没有“预写”特定机制,因为受益于它的写入已经隐含地产生预读。

想到的两种写情况是 1)“修改文件”写和 2)“完全覆盖”写。

  1. “修改文件”写——在这种情况下,你知道你要修改一个文件。您不需要为此写入设置“预写”机制的原因是因为这种类型的写入已经隐式包含读取。程序必须读入文件,以便您可以修改文件的特定部分。在读取过程中,幕后的内核已经可以进行预读以帮助将来进行读取或写入。

  2. “完全覆盖”写入 - 在这里,您不关心文件的内容是什么,您只需向其中写入全新的数据。无需读取文件,写入(假设它覆盖单个内存页面)理论上可以写入 RAM 中的新页面,然后标记为写回磁盘。没有迹象表明需要任何预取,因为过去的历史记录(完全覆盖)不需要读取/加载内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2015-11-04
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多