
假設您有一個名為大小foo.txt
為500
位元組的檔案。假設您建立一個10
大小為位元組的新檔案並將其另存為foo.txt
,從而覆蓋該檔案。作業系統(Windows 和 Linux)是否會自動確保410
釋放不再使用的空間(位元組)?
在第二種情況下,假設您使用了dd 實用程式如上所述創建舊的和新的 foo.txt。作業系統會自動確保釋放不再使用的空間嗎?
我想在幕後,對文件的所有寫入都使用相同的作業系統系統調用,因此覆蓋的處理在程式之間將是一致的...
答案1
聽起來您的問題源於將過程視為涉及幾件事:所有未使用的空間都可用於其他用途,並將與現有文件同名的文件寫入相同的位置。這兩個前提都是不準確的。另外,您談到不再使用的空間被釋放。從其運作方式來看,這些術語是同義詞。空間要么分配給文件,要么不分配。
正如 davidgo 所描述的,驅動器在整個扇區或區塊中工作。為了簡單起見,我將空間分配單元稱為「區塊」。空間以整個區塊為單位進行分配。 1 位元組文件分配整個區塊,因此,如果您正在討論小文件,則大小低於區塊的任何內容仍分配整個區塊。小(子區塊)檔案在區塊中具有未使用的空間,無法出於其他目的存取該空間。您可以談論使用多個區塊的大檔案被使用較少區塊的較小檔案替換。在這種情況下,整個區塊就不再需要了。
舊文件並沒有真正被覆蓋。新文件將保存在另一個位置,使用所需數量的區塊。文件系統的文件表中對舊文件塊的引用被修改。這些區塊將不再指派給任何檔案並可供重複使用。在這個過程中,舊文件的內容不會被刪除,只是會被忽略,直到需要空間為止。這就是為什麼您能夠恢復已刪除的檔案。
您問如果使用 dd 這是否會有所不同。 dd 有很多用途。如果您將討論限制為簡單地使用相同的名稱編寫一個新文件,那麼也會以相同的方式工作。
答案2
正如@KamilMaciorowski 所說,問題的關鍵組成部分是磁碟中的區塊大小。區塊大小小於 512 位元組的現代檔案系統非常罕見(而且大多數檔案系統的區塊大小要大得多)。這是相關的,因為這意味著如果您處理小於區塊大小的檔案操作,這些操作使用與區塊大小一樣多的資源 -所以你的問題的答案是否定的 - 400 位元組文件,佔用 1 個區塊,將被另一個使用 1 個區塊的文件替換。原始區塊可能會被釋放(但可能會被覆蓋),但您尚未節省任何磁碟空間
我懷疑你知道這一點,但對其他人來說 - 還值得注意的是,當釋放一個塊時,它通常不會被覆蓋/刪除,並且通常可以恢復。因此,對於 SSD 來說更是如此,它進一步從作業系統所看到的內容中抽像出磁碟中的內容(感謝磨損均衡)。