碎片重組

電子檔案系統的碎片重組（defragmentation）是指減少檔案系統中碎片化的程度。其作法是重新整理大容量存儲設備中的內容，讓電腦檔案存放在較連續的位置，減少檔案的各部份分散在不連續位置的情形，同時也會讓存儲設備中未使用的區域變得連續。

碎片重組對於電磁式碟盤存儲（例如硬碟、軟碟、光碟驅動器）裡的檔案系統是有益的。因為若檔案分散在不同的區域（碎片化），讀寫時磁碟讀寫頭在不同區域移動的時間會比較花時間。若是針對由非揮發性記憶體組成固態硬碟，讀寫時在不同位置存取資料的時間和在連續位置存取的時間相當，就不需要進行碎片重組，而且固態硬碟寫入次數受限，碎片重組時的資料寫入會減少其使用壽命。

## 磁碟碎片的原因

當檔案系統無法找到夠大的連續空間來儲存檔案，需要將檔案分成多份，並且在已有的檔案之間，沒儲存資料的位置找數個空間（這些空間可能之前有存放資料，後來刪除了，或是之前儲存檔案時，規劃的空間比檔案實際的空間要大）來存放檔案，這就出現了磁碟碎片。經常要在檔案後新增資料的檔案（例如記錄檔）、經常會新增及刪除的檔案（像是郵件中的檔案以及網頁的快取）、較大的檔案（例如影片檔）比較容易受到碎片化的影響，因此在讀寫這些檔案時，效能會下降。碎片重組就是要解決這些問題。

### 例子

磁碟中有五個檔案，分別用A到E來表示，其他的位置空白沒有儲存資料。每一個檔案用了十個區塊的空間（此段中，區塊是檔案系統分配空間的單位，區塊大小是在磁碟格式化時決定，會是檔案系統所支援的大小）。在磁碟空白的部份，檔案要分配空間時，會在相鄰的位置上，一個接著一個的分配所需的空間（如圖中的(1)）。若刪除檔案B，就會出現二個可行的作法：將原來檔案B的位置設定為空白，以便後續可以分配給其他的檔案，或是將B後面的檔案都往前移，讓空白的位置集中在後面。若有許多資料要移動，移動檔案就會變成很花時間的事情，因此常見的情形就是只將檔案B的位置設定為空白，可以再分配給其他的檔案，其他的資料就不移動（如圖中的(2)）實務上，刪除檔案只是將該位置設定為空白，後面可以使用此位置，不會刪除檔案的實際內容，因此才能進行反刪除，反刪除是復原那些在目錄中刪除了對應資訊，但其內容都還在磁碟中，而且其位置沒被其他檔案使用的檔案。當有新的檔案F需要六個區塊的空間，系統會用之前檔案B使用位置的前六個區塊給檔案F，後面四個區塊仍設定為空白（如圖中的(3)）。若另外一個檔案G需要四個區塊的空間，就會使用在F和C之間的四個區塊給檔案G使用（如圖中的(4)）。

不過，當檔案F再擴充時時，原來檔案F後面已沒有空間可以儲存資料，需要在以下三個方法中選擇一個來進行。

- 將檔案F移到有夠大連續空間可以存放的位置。若這個檔案比所有空間都要大，此一方法就不適用。而且，若檔案很大時，要搬移檔案也要花相當長的時間。
- 在F檔案後面的檔案往後移動，以保留足夠的空間給檔案F。若要移動的檔案不多，或是資料量不大，此方法可行。但若要移動的資料很多，就要花很長的時間移動這些檔案。
- 將新增的內容放在其他的位置，並且標示檔案F有第二部份的內容，以及第二部份內容的位置（如圖中的(5)）。

目前的檔案系統會依上述的第三個方法進行。若這類的事出現上百次，檔案系統中會有很多小的檔案片段，分散在不同位置。某些檔案會分成幾個存放在不同位置的片段。這樣的檔案系統會讓存取時間拉長，因為需要讀寫不同位置的磁碟內容（隨機存取），這很花時間。

另外，「碎片化」的概念也不只於一個檔案會分成多段，儲存在不連續區域的情形。例如，若有一些會以固定順序讀取的檔案（例如在載入軟體時要讀取的檔案，可能包括一些動態連結庫，各種資源檔、遊戲的聲音或是影像檔），若不是以其讀取的順序，存放在連續位置，若以這一組檔案來看也可以算是「碎片化」（即使個別的檔案都是連續存放，沒有分成多段儲存的情形，也是一樣）。在讀取這些檔案時，讀寫頭在讀完一個檔案後，可能要移到其他不連續的位置來讀下一個檔案。有些群組的檔案一開始會儲存在連續位置，但若其中部份檔案刪除或是更新時，就會出現碎片化的情形。常見的理由是更新，為了要更新檔案，會先刪除舊檔案，再寫入新的檔案，並且找地方存放。但大多數的檔案系統不會將新的檔案放在原來放舊檔案的位置，而此位置後續會放入不相關的資料內容。因此造成碎片化。

## 碎片問題的處理

碎片重組的目的就是要處理碎片問題，碎片重組會將分成多段的檔案進行整合，讓檔案分段的數量可以降低，最後理想上檔案會變得不分段，在不同位置儲存的檔案。碎片重組一般而言至少需要二次的複製程序：第一次是將在磁碟中位在某檔案後面的資料複製到其他位置。第二次則是將該檔案沒有儲存在連續區域的部份資料複製到第一個步驟預備的位置。在此作法下，不會從磁碟中刪除任何資料，因此就算是在過程中斷電，讓上述動作在中間中斷，仍然是安全的，不會破壞資料。

若要進行磁碟的碎片重組，碎片重組軟體（defragmenter）複製的資料量不會大過未使用的空間。若磁碟裡未使用的空間很小，或是所有空間都已使用，就無法進行碎片重組。重組過程會降低系統效能，在重組時最好不要執行其他的程式，以免檔案系統在重整過程中仍有資料的變更，造成資料的不同步。碎片重組有不同的演演算法，有些適合一階段進行重組，有些則適合多階段重組。碎片重組不會調整檔案的邏輯位置（就是在目錄結構下的檔案位置）。

碎片重組軟體除了針對檔案進行碎片重組外，也會減少載入程式以及開啟檔案的時間。例如微軟的磁碟重組工具有加入Intel應用程序載入加速器，會依各檔案的相依性決定其儲存的位置，讓載入程式，讀取檔案時，可以依在磁碟上的位置依序存取，加速程式載入時間。有些碎片重組軟體會讀取預取器檔案，識別哪些檔案可以整合成一組，存放在相鄰位置，並且在讀取時可以依序讀取。

硬碟上，在較外圍的磁軌（在硬碟啟始的磁區）資料傳輸速率要比較內圍的要快。因此將常存取的資料放在較外圍的磁軌，可以提供性能。第三方的碎片重組工具（像是MyDefrag）會將常存取的檔案放在較外圍的磁軌，並且讓這些檔案儲存在連續位置。

近期磁碟技術的進步，像是RAM快取、較快的磁片轉速、指令佇列（SCSI/ATA 標籤指令佇列或SATA NCQ）以及較高的資料密度，一定程度減輕了碎片化對系統效能的負面影響，不過常用資料量的增加抵消了一些減輕的效果。不過，現代系統的效能主要是因為大的硬碟容量而有獲益，因為半滿的磁碟其碎片化程度會比幾乎全滿的磁碟要好很多，在大容量硬碟裡，相同的資料在碟片中佔的實體空間較小，因此找的會比較快。不過平均的存取時間大約就是碟片旋轉半圈的時間，而碟片轉速（單位是rpm）是硬碟機的速度特性。相於資料傳輸速率，碟片轉速的進步程度要慢很多，因此減少搜尋次數對經常存取的大型儲存設備而言，還是有幫助的。

### 分割

要在碎片重組上最佳化並減少碎片化影響，有一種常見策略是硬碟分區，當檔案系統分為二區，將常讀取，不常寫入的部份和常常新增及刪除的檔案分開。像包括暫存目錄或是瀏覽器快取資料的目錄（大約幾天後就會被刪除）就會固定更改。若這類的檔案放在專屬的分區（例如UNIX建議的文件系統層次結構標準，一般會儲存在/var partition裡），碎片重組程式會運作的比較好，因為不需處理其他不常變更的資料（有些碎片重組軟體也可以排除特定的目錄）。對於很少寫入活動的磁碟分區，第一次的碎片重組會讓碎片化情形大幅改善，之後的碎片重組只需要處理少部份的檔案修改。

### 離線碎片重組

不可移動系統檔的存在（尤其是分頁檔）會影響碎片重組。若在作業系統沒有執行時，可以安全的移動這些檔案。例如ntfsresize可以在NTFS系統裡移動這些檔案，調整各磁碟的容量。PageDefrag軟體可以碎片重組Windows的系統檔案，像是swap檔，或是儲存註冊表的檔案，其作法是在開機後，GUI載入之前就執行應用程式。自從Windows Vista開始，就已不完全支援此功能，也沒有再更新軟體。

在NTFS系統裡，當有檔案加到磁碟中，磁碟的主文件表（MFT）大小會增加，以儲存新增檔案的資料。若MFT大小無法增加時，就會出現檔案碎片。在早期的Windows版本，若MFT分成多段儲存，就無法安全的進行碎片重組，因此微軟在碎片重組的API中增加了一個hardblock。不過自從Windows XP開始，因為Windows碎片重組API已經改進，並且支移動功能，越來越多的碎片重組可以重組分段的MFT。不過即使在改進之後，MFT的前四個磁簇仍然是Windows碎片重組API無法移動的，因此有些碎片重組軟體可能會將MFT分成二段，前四個磁簇會留在一開始初始化時的位置。

### 固態磁碟

在從傳統的機械式硬碟讀取資料時，硬碟控制器要以較慢的速度將讀寫頭定位到要讀寫的軌，之後等碟片轉到讓要讀寫資料到讀寫頭時才作讀寫。固態硬碟（SSD）是以快閃記憶體為基礎，沒有可動件，因此固態硬碟的隨機存取不會有時間過長的問題，也就不需要用碎片重組來優化讀寫時間。而且，快閃記憶體可以寫入的次數是有限的，寫入次數超過時就會損壞。因此，碎片重組對固態硬碟反而有破壞力（除非是用在補救災難性故障）。不過，Windows仍會自動的對SSD進行較小型的碎片重組，以避免檔案系統到達最大允許碎片化（maximum fragmentation tolerance）的限制。若到達該制制值時，寫入磁碟的動作會失效。

## 書目

- Norton, Peter (1994) Peter Norton's Complete Guide to DOS 6.22, page 521 – Sams (067230614X)
- Woody Leonhard, Justin Leonhard (2005) Windows XP Timesaving Techniques For Dummies, Second Edition page 456 – For Dummies .
- Jensen, Craig (1994). Fragmentation: The Condition, the Cause, the Cure. Executive Software International .
- Dave Kleiman, Laura Hunter, Mahesh Satyanarayana, Kimon Andreou, Nancy G Altholz, Lawrence Abrams, Darren Windham, Tony Bradley and Brian Barber (2006) Winternals: Defragmentation, Recovery, and Administration Field Guide – Syngress
- Robb, Drew (2003) Server Disk Management in a Windows Environment Chapter 7 – AUERBACH

## 外部連結

- The Big Windows 7 Defragmenter Test Benchmarks of popular defrag utilities
- Microsoft Windows XP defragmentation - How to schedule a weekly defragmentation Microsoft Windows 2000 Professional and Server defragmentation - How to schedule defragmentation
- SST Hard Disk Optimizer
- How Linux avoids making files fragmented
- How defragmentation was changed for Windows 7
- Complete list of Defragmentation Utilities for Windows
- Does Your SSD's File System Affect Performance?