2016-08-01 37 views
1

我有一個項目,我必須非常頻繁地更新磁盤上的數據以防掉電。當在文件中正確覆蓋512b(驅動器的一個扇區)時,文件系統會標記已更改的扇區,並在準備好刷新時將其更新到磁盤上?或者每次刷新整個文件時都會寫入整個文件?我主要關心的是ext4,但我很好奇它是否與每個文件系統一樣。文件系統:覆蓋等長的數據

如果標準不是跟蹤更改,而是覆蓋整個文件有沒有辦法改變這個?一些寫選項?

回答

1

通常在頁面緩存中緩存Linux文件,並且在頁面級別跟蹤頁面是否變髒。在英特爾x86平臺上,頁面大小爲4k,因此如果您弄髒了4k頁面,則4k頁面會被寫回。

如果您只想覆蓋單個512字節的扇區,並且您的硬盤有512字節扇區,則可以使用O_DIRECT標誌打開文件,如果發出512字節寫入,則文件偏移量爲是512字節的倍數,並且寫入源的內存緩衝區也是512字節對齊的,則可以繞過頁面緩存,寫入將直接進入磁盤(因此爲O_DIRECT)。

請注意,一些現代磁盤實際上使用4k物理扇區,但出於向下兼容性的原因,它們正在模擬512字節扇區。這些磁盤有時稱爲512e扇區(e用於仿真)。在這些驅動器上,如果執行512字節的扇區寫操作,磁盤將執行讀 - 修改 - 寫週期,因爲驅動器內部一次只能寫入4k。這對你來說是一種性能上的打擊,但從功能角度來看,它看起來與傳統的老式512扇區硬盤相同。

+0

而在一個1MB文件中,如果我寫了一個512b扇區的300b,它仍然只會覆蓋一個扇區?在擦除扇區覆蓋之前,它只會執行另一個212b的讀取操作? – Shenanigans

+0

如果您使用直接I/O,則必須執行直接I/O讀取,然後進行直接I/O寫入,並且直接I/O操作必須遵循直接I/O規則 - 因此您應該做一個512對齊的讀取,修改300字節,然後直接I/O寫入,也遵循直接I/O規則---所以緩衝區必須在512字節的邊界上對齊,寫入必須是512字節對齊的,並且長度必須是512字節的倍數。 –

+0

如果你做了緩衝寫入,那麼它將通過頁面緩存,這意味着一個4k讀/修改/寫週期。 –