簡體   English   中英

原子文件修改

[英]Atomic file modification

我想覆蓋文件中的區域(可能很小)。 假設我調用fseek,fwrite,fsync。 有沒有辦法確保這種區域重寫操作的原子性,例如,我需要確定,在任何情況下失敗,該區域將只包含舊的(修改前)數據,或僅包含新的(修改的)數據,但不包括混合這個。

我想強調兩件事。

第一 :沒有辦法原子地寫任何大小的區域是可以的 - 我們可以通過將數據附加到文件,fsync'ing,然后重寫文件中的'指針'區域來處理它,然后再次fsyncing。 但是,如果'指針'寫入不是原子的,我們仍然可以使用非法指針來破壞文件。

第二 :我很確定,寫1字節區域是原子的:我不會在文件中看到任何從未放在那里的字節。 因此我們可以使用一些技巧為地址分配兩個區域並使用1字節開關,因此重寫區域變為 - 附加新數據,同步,重寫兩個(未使用的)指針槽中的一個,再次同步,然后重寫'切換字節'並再次同步。 因此,覆蓋區域操作現在至少包含3個fsync調用。

所有這一切都會更加輕松,如果我有長時間的原子寫作,但我真的擁有它嗎?

有沒有辦法在不使用第2點中提到的方法的情況下處理這種情況?

另一個問題是 - 寫作和同步之間是否有任何順序保證? 例如,如果我調用fseek,fwrite [1],fseek,fwrite [2],fsync,我可以在[2]提交寫入,並在[1]寫入 - 不提交嗎?

這個問題適用於linux和windows操作系統,任何特定的答案(例如在ubuntu版本中都是abc ....)也是需要的。

通常可以安全地假設在HDD的一次寫入中寫入512字節的塊。 但是,我不會這么認為。 相反,我會使用您的第二個解決方案,同時在更改文件中的指針之前為您的寫入添加校驗和並進行驗證。

通常,將校驗和添加到寫入磁盤的所有內容是一種很好的做法。

要回答“同步”保證 - 您可以認為。 雖然同步是FS和磁盤相關的,但我們假設我們正在討論“合理”的實現。

  • 在第一次sync ,數據保證被刷新到磁盤(磁盤可能還在它的緩存中),如果你想要的數據得到你寫的任何東西。
  • 如果在第二次sync之后兩個sync的數據都在磁盤緩存中,那么您所描述的情況可能會發生,但恕我直言的可能性非常低。

無論如何,沒有其他機制可以保證數據在磁盤上。 這就是你必須擁有校驗和的原因。

更多信息: 確保fsync完成其工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM