1

我无法理解这个函数aio_fsync的作用。我已经阅读了手册页,甚至在谷歌上搜索过,但找不到可以理解的定义。你能用简单的方式解释它,最好用一个例子吗?

4

1 回答 1

2

aio_fsync只是fsync的异步版本;当任一完成时,所有数据都将写回物理驱动器介质。

注 1: aio_fsync() 只是启动请求;在请求完成之前,类似 fsync() 的操作不会完成,类似于其他 aio_* 调用。

注 2:仅包括在调用 aio_fsync() 时已排队的 aio_* 操作。

正如您评论提到的,如果您不使用 fsync 或 aio_fsync,则程序结束后数据仍会出现在文件中。但是,如果机器突然断电,它很可能不存在。

这是因为当您写入文件时,操作系统实际上会写入页面缓存,它是保存在 RAM 中的磁盘扇区的副本,而不是磁盘本身。当然,即使在写回磁盘之前,您仍然可以看到 RAM 中的数据。当您调用 fsync() 或 aio_fsync() 时,它将确保对该文件所有部分的 writes()、aio_writes() 等都写回物理磁盘,而不仅仅是 RAM。

如果您从不调用 fsync() 等,操作系统最终会在有空闲时间时将数据写回驱动器。或者有序的操作系统关闭也应该这样做。

我会说你通常不应该担心手动调用这些,除非你需要确保你的数据,比如日志记录,被刷新到物理磁盘并且需要更有可能在突然的系统崩溃中幸存下来。显然,数据库引擎会为交易和日志做这件事。

但是,还有其他原因,数据可能无法幸免于难,并且在面对故障时确保绝对一致性非常复杂。因此,如果您的应用程序不是绝对需要它,那么让操作系统为您管理它是完全合理的。例如,如果编译器的输出 .o 最终不完整/损坏,因为您在编译过程中或之后不久重新启动了机器,这不会让任何人感到惊讶 - 您只需重新启动构建操作。

于 2015-12-12T20:06:45.923 回答