windows - 检测不干净的文件系统关闭
问题描述
我有一个项目,我们使用内存映射文件处理大量缓存数据。我们使用 Windows 10、NTFS 和 .NET。
当用户启动应用程序时,我们检测之前的程序会话是否正确关闭,如果是,我们重用缓存。
但是,这对开发人员来说是调试时的痛苦。停止正在调试的程序是很常见的。下次启动时,需要重新计算缓存的数据,既费时又烦人。
所以,我们一直在考虑我们可以引入一个“事务日志”,这样即使之前的关闭是不干净的,我们也可以恢复。
现在解决实际问题。
似乎无法保证刷新内存映射文件的顺序。如果程序刚刚停止,则没有问题,因为整个内存映射文件将被操作系统刷新到磁盘。如果停电,问题就来了。在这种情况下,无法保证文件处于什么状态。我们的“事务日志”也无济于事,除非我们总是在修改缓存之前将事务日志刷新到磁盘。这将违背我们架构的目的,因为它会引入不可接受的性能损失。
如果我们能以某种方式知道磁盘上的内存映射文件之前处于操作系统无法在操作系统关闭之前刷新所有页面的状态,我们可以在下次启动时将整个文件丢弃。会有延迟,但这是完全可以接受的,因为它只会在断电或类似事件之后发生。
当操作系统启动时,它知道文件可能已损坏,因为它知道文件系统没有完全卸载。
最后,我的问题:
有什么方法可以询问 Windows 文件系统在挂载时是否干净?
解决方案
NTFS 定期提交自己的日志,因此有一个可能发生电源故障的窗口,并且 NTFS 会(正确地)声明卷(如“NTFS DATA”而不是用户数据)是干净的。
您可能必须做数据库所做的事情,即将您的缓存锁定到物理内存中,以便您可以控制写入磁盘。
推荐阅读
- php - 登录后从数据库中获取用户名
- mysql - 如何仅使用mysql获取从周一到周六开始的所有数据
- r - 如何绘制和覆盖多个栅格的密度图?
- c# - Autofac 解析匹配LifetimeScope 集合
- python - 如何从用户那里获取类的名称,然后创建具有相同名称的类
- javascript - 更改字体大小时在文本区域内居中文本
- c++ - 使用 minGW 和 VSCode 运行简单的 C++ 程序时找不到 libstdc++-6.dll
- python - 如何按值字符串打印嵌套字典中的键值对
- javascript - ML5,情绪分析:未捕获(承诺中)类型错误:无法读取未定义的属性“the”
- vba - 俄语单词的计数频率