Welchen Blockzuweisungsalgorithmus verwendet NTFS?


10

Unter Windows XP 64 habe ich eine 1,2-GB-Datei heruntergeladen und sie wurde fragmentiert, wie das Bild zeigt. Leider habe ich vor dem Erstellen des Schnappschusses von Piriform Defraggler die anderen Dateien defragmentiert, sodass Sie den genauen Status zum Zeitpunkt des Schreibens der Datei nicht sehen können. Die Festplatte war jedoch die ganze Zeit ungefähr so ​​leer wie jetzt (25% verwendet) und kaum fragmentiert.

Screenshot 1

Welchen Blockzuweisungsalgorithmus verwendet NTFS? Es sieht zufällig aus oder wird dort platziert, wo der Plattenkopf tatsächlich steht.

AKTUALISIEREN:

Dies geschah heute, nachdem 67 MiB einer neuen Datei geschrieben wurden. Es wurde in 731 Fragmente mit einer durchschnittlichen Größe von nur 95 KiB aufgeteilt. Die Datei wurde verwendet, um einige Lücken zu füllen, aber nicht alle. Sie verwendet auch nicht den riesigen durchgehenden freien Speicherplatz. Seltsam, nicht wahr?

Screenshot 2

UPDATE 2:

Im Gegensatz zu PC Guru glaube ich wirklich nicht, dass Opera der Schuldige ist. Ich denke, dass es (im Gegensatz zu Google Chrome) Windows nicht die erwartete Größe mitteilt. Es gibt jedoch viele Fälle, in denen dies nicht möglich ist und es in der Verantwortung des Betriebssystems liegt, vernünftig damit umzugehen. Das folgende Bild zeigt, was nach ein paar Tagen passiert ist, als ich fast nichts auf dieser Partition getan habe - das TEMP-Verzeichnis und alle meine Daten (mit Ausnahme der von Windows verwalteten) befinden sich an anderer Stelle. Windows selbst scheint SetEndOfFileseine eigenen Dateien nicht auf schreckliche Weise zu verwenden und zu fragmentieren (600 Fragmente für ein paar kleine Dateien von etwa 40 MB). NTFS scheint nicht den ersten verfügbaren Sektor zu verwenden, da sich wieder Dateien in der Mitte und auch gegen Ende der ziemlich leeren Festplatte befinden (Auslastung 23%).

Screenshot 3

Antworten:


12

IIRC, das NTFS-Dateisystem, versucht, die Datei im zusammenhängenden Speicher zuzuweisen. Dies ist jedoch nur möglich, wenn das Dateisystem die Größe der Datei kennt. Wenn Sie eine Datei öffnen und mit dem Schreiben beginnen, wird sie an die "beste" Stelle geschrieben, an die die Datei passt (normalerweise zur Außenseite des Plattentellers). Aber dieser "beste" Ort ist möglicherweise nicht groß genug, um in die Datei zu passen.

Wenn die Anwendung NTFS die tatsächliche Größe der Datei mitteilt (mit SetEndOfFile ()), kann NTFS den zusammenhängenden Speicherplatz für die Datei besser finden (die SetEndOfFile-API veranlasst NTFS, Speicher für die gesamte Datei zuzuweisen).


Aber es sieht so aus, als hätte NTFS alle Lücken gefüllt und den Rest gleichmäßig auf der Festplatte verteilt. Wie gesagt, die Festplatte war nie viel voller als jetzt. Sie haben Teile der Datei in einige der letzten Sektoren geschrieben (dh in die schlechtesten Speicherorte). Andere Teile wurden in kleinen Gebieten zwischen zwei besetzten Sektoren zusammengedrückt, obwohl es anderswo viel freien Platz gab.
Maaartinus

Haben Sie setEndOfFile aufgerufen, bevor Sie die Datei auf die Festplatte geschrieben haben? Wenn Sie dies nicht getan haben, kann NTFS die tatsächliche Größe der Datei nicht ermitteln, sodass die Datei unter Verwendung des verfügbaren Speichers vergrößert wird.
ReinstateMonica Larry Osterman

Ich war es nicht, es war Opera. Höchstwahrscheinlich nicht. Trotzdem ist es kein Grund, etwas so Seltsames zu tun.
Maaartinus

Was meinst du mit "so seltsam"? Wenn NTFS die Größe der Datei kennt, die Sie schreiben, wird es kluge Dinge über die Datei tun. Wenn die Dateigröße nicht bekannt ist, kann die Speicherzuweisung nicht annähernd so gut ausgeführt werden.
ReinstateMonica Larry Osterman

@ Larry Osterman: Sicher, ohne die Dateigröße zu kennen, ist es schwierig, es richtig zu machen. Aber es so schlecht zu machen ist auch schwer.
Maaartinus

2

Ihr Problem muss mit Opera sein. Ich habe mir gerade eine Reihe von Dateien auf einem sehr vollen und fragmentierten Laufwerk angesehen. Mit Chrome heruntergeladene große Dateien waren alle zusammenhängend.

Dies deutet darauf hin, dass Chrome die Dateigröße zu Beginn des Downloads kannte und NTFS daher die zu erwartende Dateigröße mitteilte. Wenn Sie dies tun, versucht NTFS, eine Datei in einem einzelnen Fragment oder, wenn kein Fragment groß genug ist, in die größten verfügbaren Fragmente zu platzieren. Interessanterweise werden diese Fragmente immer in absteigender Reihenfolge der Größe verwendet, sodass große Dateien, die vom Explorer auf ein fragmentiertes Laufwerk kopiert wurden, über das gesamte Laufwerk springen können.

Wenn das Programm die Dateigröße nicht kennt oder NTFS nicht informiert, sondern nur eine Datei öffnet und sequentielle Daten schreibt, scheint NTFS FAT32 sehr ähnlich zu sein, das einfach beim ersten verfügbaren Cluster (oder) beginnt Der erste, der nach dem letzten in dieser Sitzung zugewiesenen verfügbar ist, verwendet dann alles, was von dort an verfügbar ist. Als Beispiel habe ich ungefähr zur gleichen Zeit CCleaner gebeten, die Registrierung zu scannen, wodurch sie in einer großen txt ".Reg" -Datei gesichert wurde. Diese Datei wurde kurz vor dem Start des Laufwerks gestartet und dann auf 127 verschiedene Fragmente verteilt. Im Gegensatz zu Dateien, die mit dem Explorer kopiert oder mit Chrome heruntergeladen wurden, wurden die Cluster in jeder von mir betrachteten Datei in aufsteigender Reihenfolge zugewiesen.

Für diese Forschung habe ich Winhex verwendet (kostenlose Testversion von Winhex.com erhältlich). Beim Betrachten eines Verzeichniseintrags. Klicken Sie mit der rechten Maustaste auf einen Dateinamen und wählen Sie Position, Cluster auflisten, um eine Liste der von dieser Datei verwendeten Cluster anzuzeigen.


Ich habe Ihre Antwort in meiner Frage kommentiert, da mein Kommentar lang geworden ist und ich ein Bild hinzugefügt habe.
Maaartinus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.