Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 检测不干净的文件系统关闭_Windows_Filesystems_Ntfs_Memory Mapped Io - Fatal编程技术网

Windows 检测不干净的文件系统关闭

Windows 检测不干净的文件系统关闭,windows,filesystems,ntfs,memory-mapped-io,Windows,Filesystems,Ntfs,Memory Mapped Io,我有一个项目,我们使用内存映射文件处理大量缓存数据。我们使用Windows10、NTFS和.NET 当用户启动应用程序时,我们检测上一个程序会话是否正确关闭,如果正确,我们将重用缓存 然而,这对于调试时的开发人员来说是一件痛苦的事情。停止正在调试的程序是很常见的。在下一次启动时,需要重新计算缓存的数据,这需要时间,而且很烦人 所以,我们一直在想,我们可以引入一个“事务日志”,这样即使之前的关机不干净,我们也可以恢复 现在来看实际问题 似乎无法保证内存映射文件的刷新顺序。如果程序刚刚停止,就没有问

我有一个项目,我们使用内存映射文件处理大量缓存数据。我们使用Windows10、NTFS和.NET

当用户启动应用程序时,我们检测上一个程序会话是否正确关闭,如果正确,我们将重用缓存

然而,这对于调试时的开发人员来说是一件痛苦的事情。停止正在调试的程序是很常见的。在下一次启动时,需要重新计算缓存的数据,这需要时间,而且很烦人

所以,我们一直在想,我们可以引入一个“事务日志”,这样即使之前的关机不干净,我们也可以恢复

现在来看实际问题

似乎无法保证内存映射文件的刷新顺序。如果程序刚刚停止,就没有问题了,因为操作系统会将整个内存映射文件刷新到磁盘。如果停电,问题就来了。在这种情况下,无法保证文件处于什么状态。我们的“事务日志”也没有帮助,除非我们总是在修改缓存之前将事务日志刷新到磁盘。这将破坏我们架构的目的,因为它将引入不可接受的性能损失

如果我们知道磁盘上的内存映射文件以前处于操作系统关闭前无法刷新所有页面的状态,那么我们就可以在下次启动时丢弃整个文件。可能会有延迟,但这是完全可以接受的,因为它只会在断电或类似事件之后发生

当操作系统启动时,它知道文件可能已损坏,因为它知道文件系统没有完全卸载

最后,我的问题是:


是否有办法询问Windows在安装文件系统时是否干净?

NTFS会定期提交自己的日志,因此有一个窗口可能会发生电源故障,NTFS会(正确地)声明卷(如“NTFS数据”而不是用户数据)是干净的


您可能需要像数据库一样将缓存锁定到物理内存中,以便控制对磁盘的写入。

谢谢!这回答了我的问题。我们选择做的是只检测自上次打开缓存以来是否有重新启动,如果没有正常关闭程序,则始终重建。这意味着即使缓存实际上是干净的,并且有人重置了他们的计算机,我们也会重建。我们通过写入单独的文件和使用FlushFileBuffers刷新来跟踪缓存是否“打开”,以便始终正确跟踪状态。