2016-12-05 29 views

回答

3

如果您查看對建議的Boost.AFIO v2的映射文件支持https://ned14.github.io/boost.afio/classboost_1_1afio_1_1v2__xxx_1_1map__handle.html,您將注意到也缺少刷新映射文件視圖的能力。

之所以這樣,是因爲當映射視圖在每種情況下都與該文件的頁面緩存緩衝區相同時,它在現代統一頁面緩存內核上是多餘的。因此,msync()在這樣的內核上是不可操作的,因爲當系統確定它合適時,髒頁已經排隊等待寫入存儲器。您可以阻止您的過程,直到系統完成使用舊的fsync()寫出該文件的所有髒頁面爲止。

以上所有內容不適用於以下情況:(a)您的內核不是統一的頁面緩存設計(QNX,NetBSD等)或(b)您的文件駐留在網絡文件系統中。如果你處於(一)情況,最好避免內存映射I/O,只是做read()write(),他們是如此少的操作系統,現在讓他們遭受糟糕的表現。對於(b)的情況,你很難被用來在網絡文件系統中使用內存映射I/O。只有不變的文件只讀地圖的參數,否則只是不這樣做,除非你知道你在做什麼。回落到read()write(),這是更安全,不太可能驚喜。

最後,您鏈接到一個安全的文件刪除程序。由於延遲擴展區分配或寫入分配複製,這些程序不再可靠地與最近的文件系統一起工作。換句話說,當您重寫現有文件的某個部分時,它不會修改存儲器上的原始數據,而是實際分配新存儲並將文件的擴展名列表指向新鏈接列表。這允許在容易意外丟失數據之後恢復一致的文件系統。要安全地刪除最近的文件系統上的數據,您通常需要使用特殊的OS API,儘管刪除所有文件,然後用隨機數據填充可用空間可能會安全地刪除大多數時間內存在問題的數據。注意寫入文件系統上的副本可能不會將釋放的擴展盤釋放回可用空間池,以便在下一次啓動垃圾收集例程或刪除快照之前的許多天或數週內進行新的分配。在這種情況下,用隨機填充可用空間將不會安全地刪除相關文件。如果所有這些都是問題,那麼使用FAT32作爲文件系統,這非常簡單,重寫數據確實會重寫存儲中的相同數據(儘管請注意,某些存儲介質(例如SSD)極有可能不會重寫數據,這些也是稍後將修改寫入新的存儲和垃圾收集釋放盤區)。

+0

雖然[SDelete文檔](https://technet.microsoft.com/en-us/sysinternals/sdelete.aspx)先前向我暗示,我並不希望自己能保持高水平,噸。 並感謝您的回答:我通常不會「接受」單個答案,因爲它似乎沒有必要;然而,既然你已經被某個不知名的人投票過了,我也可以這樣做。 – user7023624

+0

毫無疑問,我是來自boost-dev的衆多粉絲之一。在我說我在這裏回覆之後不久,它就被壓低了。我所知道的最接近的便攜式安全刪除算法是刪除你想要的所有文件,創建一個填充所有空閒空間的文件,然後如果你的設備支持TRIM,只需fsync,然後刪除文件。如果TRIM不受支持,請填入零,fsync,然後刪除。這應該在大多數情況下安全地刪除大部分數據,並且在支持TRIM的設備上也可以快速刪除。謝謝你的回答。 –