fsync()在数据块间的原子性

3

当对文件调用fsync()时,文件会变得损坏吗?

例如,假设我的文件跨越两个磁盘块:

    A             B
|---------|    |--------|
| Hello,  | -> | World! |
|---------|    |--------|
| 1234567 |    | 89abcd |
|---------|    |--------|

假设我想以一种非常低效的方式将整个文件内容更改为小写。因此,我希望将文件的位置1定位到将“H”更改为“h”的位置,然后将位置8更改为将“W”更改为“w”的位置。然后,我调用fsync()来同步文件。该文件分布在两个磁盘块上。

  1. 写入的顺序是否得到保留?
  2. fsync()操作是否跨磁盘是原子性的?
1个回答

1

fsync调用不会返回,直到两次写操作与所有关联的元数据都写入磁盘。如果您的计算机崩溃(通常是因为断电),并且您有一个损坏的文件,那么请向文件系统维护者提交错误报告 - 这不应该发生。如果fsync返回,则数据已经安全地写入磁盘。

然而,回答您的问题,文件系统和磁盘驱动程序可以重新排序写入(它们将其视为非重叠的,如果在旋转介质上磁头位于第二个写入位置,可能更有用先写入第二个)。其次,由于它涉及真实的硬件,fsync无法保证原子性。但对于用户来说,它应该表现得像原子操作一样(您将获得文件的第一个副本或第二个副本,但不会出现损坏的情况)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接