【问题标题】:Are file reads served from dirtied pages in the page cache?是否从页面缓存中的脏页提供文件读取?
【发布时间】:2016-10-14 03:50:04
【问题描述】:

当字节被写入文件时,内核不会立即将这些字节写入磁盘,而是将字节存储在页面缓存中的脏页中(回写缓存)。

问题是,如果在脏页刷新到磁盘之前发出文件读取,是从缓存中的脏页提供字节还是先将脏页刷新到磁盘,然后再进行磁盘读取以提供服务字节(将它们存储在进程中的页面缓存中)?

【问题讨论】:

  • 这不是一个编程问题,而是关于 Linux 内部的问题。可能更适合 Linux 站点

标签: linux caching linux-kernel filesystems page-caching


【解决方案1】:

文件读取将从页面缓存中获取数据而不写入磁盘。来自 Robert Love 的 Linux Kernel Development 3rd Edition

每当内核开始读操作​​时——例如,当一个 进程发出 read() 系统调用——它首先检查是否需要 数据在页面缓存中。如果是,内核可以放弃访问 磁盘并直接从 RAM 中读取数据。这称为缓存 打。如果数据不在缓存中,称为缓存未命中,内核 必须调度块 I/O 操作以从磁盘读取数据。

定期写回磁盘,与读取分开:

Linux 采用的第三种策略称为回写。在一个 回写缓存,进程直接执行写操作到 页面缓存。后备存储不会立即或直接更新。 相反,页面缓存中的写入页面被标记为脏 并被添加到脏列表中。定期地,脏列表中的页面 在称为 writeback 的过程中写回磁盘,将 与内存缓存一致的磁盘复制。

【讨论】:

  • 谢谢 - 另一个问题 - 如果文件读取是从尚未同步到磁盘的脏缓存提供的,并且系统在脏字节写入磁盘之前断电,我们会从从未提交到磁盘的“文件” - 这是真的吗?
  • 我想是的。更有趣的是数据多久同步到磁盘的问题。块 I/O 调度程序涵盖了这一点 - 截止日期、预期、完全公平排队、noop。通常他们优先考虑读取(从磁盘同步到缓存)而不是写入(从缓存同步到磁盘)。
【解决方案2】:

从应用程序开发人员的角度来看,可以合理地假设 write 之后的 read 将获取写入所存储的信息。

Linux 提供了这样的保证,隐藏了实现细节。因此,无论是否使用缓存,写入的效果都是一样的:futher read 将返回已发出写入的内容

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2021-12-29
    相关资源
    最近更新 更多