为了清楚起见,我的问题与语言/操作系统无关(独立)。
我正在开发一个程序(支持许多操作系统,目前用 Golang 编写)接收许多数据块(如数据块流)并按顺序将其全部写到预先指定的位置(pos >= 0)文件。只有 1 个进程和 1 个线程访问该文件。我使用常规的写入函数,它在内部使用写入系统调用(取决于它运行的操作系统),而不是缓冲 IO。
假设在我的程序正在编写时,突然系统崩溃(最严重的崩溃类型:电源故障)。
当系统重新打开时,我需要验证有多少块完全写入 HDD。(*)
我的程序写入的 HDD 只是今天的普通台式机或笔记本电脑 HDD(不是某些高端服务器中的一些花哨的(带电池后备的))。
假设在传输到 HDD 和从 HDD 读取期间发生位损坏的可能性非常小,并且可以忽略不计。
我的问题是:
- 我是否需要对所有写入的块进行校验和以验证 (*)?
还是我只需要检查并确认第 n 个块是正确的,并假设它之前的所有块 (0 -> n-1) 也是正确的?
2.1 如果 2. 足够了,这是否意味着任何操作系统的 FS 都可以保证顺序写入顺序(随机写入仍然可以重新排序)?
- 我的恢复方式是否依赖于与许多防崩溃数据库中看到的仅附加日志文件相同的原则?