5

在我们将数据写入磁盘之前存在页面缓存。

所以如果我有两个操作。

write(fileA)
write(fileB)

然后如果系统突然关闭。我们不会主动调用 sync() 调用。

我想知道是否有可能我们写入fileB的数据已经刷新到磁盘,而我们写入fileA的数据还没有刷新到磁盘?

4

2 回答 2

5

我相信 fileB 有可能在 fileA 之前写入磁盘,因为写入将被捆绑到块 I/O 请求中,并且可以由 I/O 调度程序在块设备层重新排序,以尽量减少磁盘查找.

有关 I/O 调度程序(电梯)的更多信息,请参阅内核文档:http: //lxr.free-electrons.com/source/Documentation/block/biodoc.txt#L885

于 2015-07-16T06:34:08.007 回答
0

简而言之,您可能需要考虑在应用程序中调用sync()或系统调用,以确保数据立即同步到磁盘。fsync()write()

flush(或 pdflush)内核线程负责将脏页同步到磁盘。当系统shutdown正常运行时,所有脏缓冲区都会同步/写入磁盘。但是,在突然断电的情况下,情况就不一样了,因为尚未刷新/同步到磁盘的数据显然会丢失。

如果您不调用sync()您的应用程序,那么脏缓冲区会根据某些内核可调参数写入磁盘。sysctl您可以通过内核可调参数控制应用程序数据如何同步(非活动脏页) 。您可能需要考虑阅读有关以下内容的更多信息:

vm.dirty_expire_centisecs - 脏页在写入磁盘之前必须存在多长时间(以 1/100 秒计)

vm.dirty_writeback_centisecs - 内核多久唤醒一次 BDI-flush 线程以将脏页同步到磁盘上

vm.dirty_background_ratio - 系统内存的百分比,当脏时系统可以开始将数据写入磁盘

vm.dirty_ratio - 系统内存的百分比,当脏时执行写入的进程应该阻塞以将脏页写入磁盘

于 2014-11-03T07:15:52.843 回答