当字节写入文件时,内核不会立即将这些字节写入磁盘,而是将字节存储在页面缓存中的脏页中(回写缓存)。
问题是,在将脏页刷新到磁盘之前是否发出了文件读取,是否将从缓存中的脏页提供字节,或者是否将脏页首先刷新到磁盘,然后再读取磁盘读取服务字节(在过程中将它们存储在页面缓存中)?
答案 0 :(得分:1)
读取的文件将从页面缓存中获取数据而无需写入磁盘。来自Robert Love的 Linux内核开发第3版:
每当内核开始读取操作时 - 例如,当a 进程发出read()系统调用 - 它首先检查是否必要 数据在页面缓存中。如果是,内核可以放弃访问 磁盘并直接从RAM中读取数据。这称为缓存 击中。如果数据不在缓存中,则称为内存缓存未命中 必须安排阻止I / O操作以从磁盘读取数据。
定期发生回写,与读取分开:
Linux采用的第三种策略称为回写策略。在一个 回写缓存,进程直接执行写操作 页面缓存。后备存储不会立即或直接更新。 相反,页面缓存中的写入页面被标记为脏 并被添加到脏列表中。定期,脏列表中的页面 在一个名为writeback的进程中被写回磁盘,带来了 与内存缓存一致的磁盘复制。
答案 1 :(得分:0)
从应用程序开发人员的角度来看,可以合理地假设 write 之后的读取将获得写入存储的信息。
Linux提供了这样的保证,隐藏了实现细节。因此,无论是否使用缓存,写入的效果都是相同的:进一步阅读将返回已发布的内容。