0

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

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

4

2 回答 2

3

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

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

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

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

于 2016-10-14T08:25:03.903 回答
0

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

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

于 2016-10-14T07:24:51.577 回答