You need to enable JavaScript to run this app. NTFS下带无缓冲、直写标志的WriteFile运行时崩溃/BSOD的写入结果如何
优惠活动
大模型
产品
解决方案
定价
更多

NTFS下带无缓冲、直写标志的WriteFile运行时崩溃/BSOD的写入结果如何

结论前置

在你描述的NTFS默认配置、开启FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_RANDOM_ACCESS标志、10MB分片对齐写入、不考虑断电的场景下,故障发生时正在写入的10MB分片可能出现完全写入、完全未写入、部分写入三种状态,具体取决于故障发生时IO请求的执行阶段,分场景说明如下:

应用崩溃/异常终止场景

同步WriteFile调用需要等所有拆分后的小块IO全部写入磁盘后才会返回成功,异步WriteFile则需要等IO完成通知触发才代表写入完成:

  • 若故障发生时,所有拆分后的IO均已完成写入:分片完全写入
  • 若故障发生时,所有IO均未下发到磁盘控制器:分片完全未写入
  • 若故障发生时,部分IO已经下发到磁盘并完成写入,剩余IO还在内核态队列中:内核会直接丢弃未下发的IO,已经完成写入的部分不会回滚,最终出现部分写入的状态

注:应用崩溃时系统内核仍正常运行,不会中断已经下发到磁盘控制器的IO执行,已经下发的IO一定会完成写入。

Windows蓝屏(BSOD)场景

BSOD发生时系统会立即停止所有内核态和用户态任务的执行,不再处理任何IO队列中的请求:

  • 若故障发生时,所有拆分后的IO均已下发到磁盘控制器并完成:分片完全写入
  • 若故障发生时,所有IO均未下发到磁盘控制器:分片完全未写入
  • 若故障发生时,部分IO已经下发到磁盘:已经下发的IO会被磁盘正常执行完成(不考虑断电的前提下磁盘供电正常,不受系统蓝屏影响),未下发的IO直接丢失,最终出现部分写入的状态

补充说明

NTFS默认只保证文件系统元数据的事务原子性,不会对普通用户数据的写入提供跨扇区的原子性保证,大于单个扇区的写入如果中途被打断,就会出现部分写入的情况。如果需要保证10MB分片的写入原子性,需要借助事务性NTFS(TxFS)相关接口实现。

内容的提问来源于stack exchange,提问作者morthy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 20:57:02