fs.write();fs.flush();它什么时候真正写入磁盘?如果内核死机或断电怎么办

本文关键字:fs 如果 内核 断电 怎么办 磁盘 死机 flush write 什么时候 | 更新日期: 2023-09-27 17:59:20

我需要实现一些对辅助存储的原子写入。我怎么能证明这是愚蠢的?

如果我使用file.open打开C#文件句柄,我将收到一个句柄。我可以给它写一些数据。刷新它并关闭它。但我仍然有一些问题。我想下面的说法是真的?

  • 数据可能不会写入磁盘,而是存在于Windows磁盘缓存中

  • 数据可能不会写入磁盘,而是存在于HDD缓存中

这将导致以下问题:

  • 停电将使我所做的文件中的编辑恢复(在像NTFS这样的事务性FS上)

  • 内核死机将使我所做的文件中的编辑恢复(在像NTFS这样的事务性FS上)

我的假设正确吗?如果是这样的话,我该如何对磁盘进行防傻写入?我对NoSQL进行了一点研究,并一直在想,可能有一个NoSQL服务器可以与更靠近硬件的系统进行通信,并且在能够保证字节写入磁盘之前不会将软件返回给我。

欢迎所有想法和想法

Jens

[编辑]在确定所有更改都写入物理磁盘之前,我可能需要等待一段特定的时间?

fs.write();fs.flush();它什么时候真正写入磁盘?如果内核死机或断电怎么办

使操作完全"防傻"的唯一方法是排队、运行操作并确认。事情保持在队列中,可以再次运行,直到确认,或者如果确认是否定的,则可以"回滚"。

假设你不涉及网络(一切都是本地的),你谈论的时间窗口非常小。尽管如此,如果你想确保事情顺利进行,你还是要排队。MSMQ是一个选项。如果数据来自SQL Server,您可以考虑它的排队机制Service Broker(不建议这样做,但这是一种方式)。

最终,这里的想法很像握手,在大多数服务器到服务器的通信中都使用握手。每个人都同意,在双方都放弃自己的工作之前,事情就已经完成了。

我不是Windows内部的专家,但我相信你是对的。我没有对它进行详细的测试,但能够使用MSMQ作为一个非常可靠的存储数据的地方,使用另一个进程来监控队列以进行最终处理。