首頁 > 遊戲

為什麼早期的 Windows 需要整理碎片?

由 程式碼民工小小嘉 發表于 遊戲2021-10-31

簡介我們簡單總結一下早期的 Windows 需要碎片整理的兩個原因:早期的 Windows 系統使用簡單的 FAT 檔案系統,該檔案系統經過頻繁的寫入刪除操作會導致大檔案散落在磁碟的各處

磁碟碎片整理有什麼好處和壞處

記得十幾年前還在用早期 Windows 系統的時候,每用一段時間系統都會變得很卡頓,這時候需要開啟系統提供的下面的磁碟碎片整理程式,當碎片整理完成後會感覺到系統變得稍微流暢了一些。

為什麼早期的 Windows 需要整理碎片?

在檔案系統中,碎片整理(Defragmentation)是減少檔案系統中碎片的過程[^2],該過程會將磁碟上相同檔案的的內容按照順序重新排列並利用壓縮演算法去除檔案之間的空隙,有點類似垃圾回收中的標記壓縮演算法[^3]。

作者已經很多年都不使用 Windows 作業系統了,上大學之後就一直在用 macOS 到今年也有七八年的時間了,最近在研究檔案系統時突然想到小時候經常見到的磁碟碎片整理程式彷彿已經消失了。不知道今天的 Windows 是否還需要磁碟整理,但是無論是 Linux 還是 macOS 上都沒有類似的工具[^1],這不禁讓作者想要研究一下背後的原因。總得來說,作業系統需要碎片整理主要有以下兩個原因:

檔案系統的設計使得資源被釋放後出現很多碎片;

機械硬碟的隨機讀寫效能比順序讀寫差幾個數量級;

檔案系統

上古時代的 Windows 使用了非常簡單的檔案系統 - 檔案分配表(File Allocation Table、FAT)[^4],該檔案系統的設計是造成磁碟出現碎片的根本原因,不過在分析該系統之前,我們在這裡先介紹一下檔案系統的歷史。

FAT 是 1977 年最開始為軟盤設計的檔案系統,軟盤是一種非常古老的儲存介質,今天的電腦基本上也都移除了軟盤的驅動,當時的軟盤都只能整盤的寫入,所以更新軟盤上的資料其實會覆蓋原來的全部內容,這也就不存在所謂的磁碟碎片了。

在該檔案系統被使用後不久,隨著機械硬碟(Hard Disk Driver、HDD)的價格開始變得逐漸低廉並被廣泛使用,微軟選擇在 DOS 和 Windows 9x 系列擴充套件 FAT 檔案系統以支援更大的空間,而資料庫等磁碟敏感型的應用也迅速變得非常熱門。

每次寫入資料都需要重新寫入整張軟盤是比較低效的做法,不過因為軟盤的儲存空間比較小,所以這在當時也是可以接受的,但是隨著儲存介質的空間變得越來越大,我們需要引入隨機寫入提高效率,支援隨機寫入的 FAT 也是很簡單的檔案系統[^5]。

為什麼早期的 Windows 需要整理碎片?

如上圖所示,如果我們要向一塊新的硬碟寫入多個檔案 A、B 和 C,這些檔案會在 FAT 檔案系統中按照順序儲存,檔案之間不存在任何碎片。然而如果在這時我們決定刪除其中 B 檔案並向檔案系統中寫入更大的檔案 D,會出現比較有趣的情況。

為什麼早期的 Windows 需要整理碎片?

FAT 檔案系統在磁碟上會先找到刪除 B 後留下的兩塊空閒位置並在其中寫入 D 檔案的一部分,隨後又會在 C 檔案後找到另一塊空閒位置並將 D 檔案的剩餘內容全部寫到該位置。這樣造成的結果是 D 檔案會分散在硬碟上,當用戶讀取 D 檔案時需要觸發多次隨機讀取。

FAT 是一種非常簡單、原始的檔案系統,它的設計和實現從今天的角度來看都很糟糕,每次寫入檔案時不僅不會檢查空閒空間的大小、造成檔案碎片,還不包含碎片管理功能,使用時間過長還需要使用者手動觸發磁碟的碎片整理,這其實是很糟糕的設計和使用者體驗。

機械硬碟

機械硬碟(Hard Disk Drive、HDD)是一種基於電子的、非易失的機械資料儲存裝置,它使用磁性儲存器儲存並查詢磁碟上的資料,在讀取和寫入資料的過程中,硬碟機械臂連線的磁頭會讀寫磁碟表面的位[^6]。

正是因為磁碟具有比較複雜的機械結構,所以磁碟的讀取和寫入都要花費很多時間,資料庫的讀寫效能也基本都依賴於磁碟的效能,如果我們在使用機械硬碟的資料庫中隨機查詢一條資料,這可能會觸發磁碟的隨機 I/O,然而將資料從磁碟讀取到記憶體中所需要的成本是非常大的,普通磁碟(非 SSD)載入資料需要經過佇列、尋道、旋轉以及傳輸的這些過程,大概要花費 10ms 左右的時間[^7]。

為什麼早期的 Windows 需要整理碎片?

當我們在磁碟中讀取檔案時,如果檔案的內容散落到了磁碟上的不同位置,它可能需要執行多次隨機 I/O 才能夠獲取該檔案的全部內容,這對於機械結構的磁碟來說是很大的額外開銷。如果檔案的內容會儲存在相同的位置,那麼讀取檔案時僅需要執行一次隨機 I/O,後續的讀取都可以使用速度約為 40 MB/s 的順序 I/O,這可以顯著減少檔案的讀取時間。

碎片化的檔案在機械硬碟上會導致比較嚴重的效能問題,在理想情況下,我們希望磁碟能夠達到它的讀寫頻寬上限;但是在實際使用過程中,頻繁的隨機 I/O 讓磁碟將大多數的時間都花在尋道和旋轉上,導致其無法全力工作。與機械硬碟相比,具有電子結構的固態硬碟能夠更好地耐受碎片化的檔案系統,而整理碎片反而會影響它的使用壽命。

總結

相信很多工程師在進入這一行業之前都會使用 Windows 系統,早期的 Windows 是桌面系統近乎唯一的選擇,作者對今天的這個題目有比較特殊的感情,在研究作業系統的檔案系統之前一直都沒有想過這個問題,直到碎片化的檔案系統一詞讓自己想到了十多年前的疑問,這種豁然開朗的感覺在今天還是很少能夠體會到的。我們簡單總結一下早期的 Windows 需要碎片整理的兩個原因:

早期的 Windows 系統使用簡單的 FAT 檔案系統,該檔案系統經過頻繁的寫入刪除操作會導致大檔案散落在磁碟的各處;

機械硬碟在十多年前還是當時的主流裝置,不過因為硬碟的機械結構,所以隨機讀寫磁碟上的位置需要物理上的尋道和旋轉,導致該過程極其緩慢;

到最後,我們還是來看一些比較開放的相關問題,有興趣的讀者可以仔細思考一下下面的問題,與前面的問題不同,作者會在後面的文章中解答這兩個問題:

為什麼 macOS 的檔案系統不需要整理碎片?

為什麼 Linux 的檔案系統不需要整理碎片?

如果對文章中的內容有疑問或者想要了解更多軟體工程上一些設計決策背後的原因,可以在部落格下面留言,作者會及時回覆本文相關的疑問並選擇其中合適的主題作為後續的內容。

Tags:檔案系統磁碟碎片檔案硬碟