gpt4 book ai didi

filesystems - 文件操作顺序的保证

转载 作者:行者123 更新时间:2023-12-02 00:29:52 25 4
gpt4 key购买 nike

我想知道对文件/文件系统的操作顺序是否有任何保证。

考虑我有一个文件 foo.dat 并且我更新它如下:

 lseek(fd,pos_a,SEEK_SET);
write(fd,data_a,size_a); //< - Operation A
lseek(fd,pos_b,SEEK_SET);
write(fd,data_b,size_b); //< - Operation B
lseek(fd,pos_c,SEEK_SET);
write(fd,data_c,size_c); //< - Operation C

这样我在文件 A、B、C 中进行更新。可能会出现一些故障 - 软件崩溃或例如电源故障。

是否有任何保证以相同的顺序执行操作。

即要么什么都没有,要么没有“A”,要么“A 和 B”,要么“A 和 B 和 C”

但不是像“A 和 C”或“B”这样的情况。

我知道如果我在 A 和 B 之间调用 fsync(fd) 并且在 A 和 C 之间调用相同但是它还保证实际上在文件系统上。

我不太关心数据的松散性,而是关心它的一致性。

POSIX 标准是否保证不会出现乱序执行?

所以:

  • 有没有这样的保证?
  • 在 POSIX 平台上?
  • 在 Windows 平台上?
  • 如果不是,我可以有什么保证(除了 fsync)?

最佳答案

这是 POSIX 对 write 的要求:

After a write() to a regular file has successfully returned:

  • Any successful read() from each byte position in the file that was modified by that write shall return the data specified by the write() for that position until such byte positions are again modified.

  • Any subsequent successful write() to the same byte position in the file shall overwrite that file data.

这并不能保证您的数据将以该顺序写入磁盘。只要应用程序“看到”的内容与上述两个陈述一致,该实现就可以根据需要重新排序物理写入。

在实践中,内核甚至磁盘子系统(例如 SAN)都可以重新排序写入(通常出于性能原因)。

因此您不能依赖写入调用的顺序来保持一致性。您将需要 f[data]sync

PostgreSQL 邮件列表中有趣的电子邮件线程:POSIX file updates .阅读数据库如何处理 I/O 是了解此类问题的好方法。

(抱歉,Windows 在这方面不了解。)

关于filesystems - 文件操作顺序的保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7463925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com